如何格式化数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何格式化数组相关的知识,希望对你有一定的参考价值。
我正在尝试读取包含销售数据(名称,位置和数量)的文件。每个文件适用于不同的人,但可以包含多个条目。当我从磁盘读取它们时,我得到这样的东西:
步骤1:
Array (
[0] => sue
[1] => salem
[2] => 30
)
Array (
[0] => bob
[1] => salem
[2] => 10
)
Array (
[0] => sue
[1] => benton
[2] => 2
)
Array (
[0] => bob
[1] => benton
[2] => 30
)
第2步:我需要将上面的内容转换为这个数组:
Array (
[0] => array (
[name] => sue
[locn] => salem
[sales] => 30
)
[1] => array (
[name] => bob
[locn] => salem
[sales] => 10
)
[2] => array (
[name] => sue
[locn] => benton
[sales] => 2
)
[3] => array (
[name] => bob
[locn] => benton
[sales] => 30
)
)
然后我会像这样走这个数组:
for ($i = 0; $i < count($sales_array); $i += 2) {
echo 'LOCN: ' . $sales_array[$i]['locn'];
echo ' NAME: ' . $sales_array[$i]['name'] . ' - ' . $sales_array[$i]['sales'];
echo ' NAME: ' . $sales_array[$i+1]['name'] . ' - ' . $sales_array[$i+1]['sales'];
}
想法是得到这个结果:
LOCN: salem NAME: Sue - 30 NAME: Bob - 10
LOCN: benton NAME: Sue - 3 NAME: Bob - 30
至少有两个问题。第一个问题是从第1步到第2步。我无法弄清楚如何获得我需要的数组。
第二个问题是代码假定前两个项目将用于同一位置。由于我在文件中的阅读方式,它们在我的测试中,但我不确定是否总是这样。有人会告诉我如何做到这一点或更好的方法来实现这一目标,拜托?
答案
您可以使用array_combine使数组关联。
$keys = ["name", "locn", "sales"];
Foreach($arr as &$subarr){
$subarr = array_combine($keys, $subarr);
}
这会循环遍历您的数组,并将键和子数组与值组合在一起。 原始数组应该是你的“step2”。
为了获得第二部分,我不会根据需要使用阵列设置。 我会使用关联来保持每个数组中的位置分组。
$keys = ["name", "locn", "sales"];
Foreach($arr as $subarr){
$res[$subarr[1]][] = array_combine($keys, $subarr);
}
$res[salem][0][name] = "sue"
这将使阵列结构略有不同,但它会将您的城市保持在一个阵列中,每个阵列都可以轻松地在回声部分获得您想要的结果。
如果你需要上面数组的输出,这是一个例子: https://3v4l.org/Y6OKk
$prev_city ="";
foreach($res as $city => $sales_array){
echo 'LOCN: ' . $city . " <br>
";
foreach($sales_array as $sales){
echo ' NAME: ' . $sales['name'] . ' - ' . $sales['sales'] . " <br>
";
}
echo "<br>
";
}
这将输出:
LOCN: salem
NAME: sue - 30
NAME: bob - 10
LOCN: benton
NAME: sue - 2
NAME: bob - 30
另一答案
如果键位置是固定的,您可以使用以下方法
$sales_array = array();
foreach($step1 As $array){
//construct the inner array
$person = array("name"=>$array[0],'locn'=>$array[1],'sales'=>$array[3]);
// add it to sales_array
$sales_array []= $person;
}
然后根据需要迭代数据。
另一答案
您可以像这样转换数据:
$x = array_reduce($input, function($carry, $item) {
$keys = ['name', 'locn', 'sales'];
$carry[] = array_combine($keys, $item);
return $carry;
}, []);
print_r($x);
如果数据按任何顺序排列,那么您需要对其进行整理,以便获得所需的数据。我正在做一些假设,因为你没有说清楚一些事情。
- 看起来您需要按位置组织的数据
- 这个人的名字是独一无二的。
- 一个人可以在不止一个地方。
- 对于每个位置,一个人只会在数据中一次。
XXXXX
$input = [
['Thorn', 'East', 10],
['Sue', 'West', 20],
['Sue', 'North', 30],
['Fenton', 'North', 12],
['Sue', 'South', 40],
['Bob', 'South', 17],
['Marc', 'East', 11],
['Sam', 'West', 20],
['Adam', 'South', 19],
];
$masterData = array_reduce($input, function($carry, $row) {
$carry[$row[1]][$row[0]] = $row[2];
return $carry;
}, []);
//print_r($masterData);
foreach($masterData as $location => $salesArr) {
echo $location . "
";
$names = array_keys($salesArr);
sort($names);
foreach($names as $name) {
echo ' ' . $name . ' ' . $salesArr[$name] . "
";
}
}
输出:
East
Marc 11
Thorn 10
West
Sam 20
Sue 20
North
Fenton 12
Sue 30
South
Adam 19
Bob 17
Sue 40
您可以从这一点以任何方式格式化数据。
以上是关于如何格式化数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将此 JavaScript 代码片段翻译成 Parenscript?