我有以下数组。
Array(
[1041] => 30
[1046] => 10
[1047] => 10
)
我希望将它存储如下。
Array([0] => Array
(
[material_name] => 1041
[material_qty] => 30
)
[1] => Array
(
[material_name] => 1046
[material_qty] => 10
)
[2] => Array
(
[material_name] => 1047
[material_qty] => 10
) )
现在我正在尝试存储键值,但它只存储最后一个值。
for($i=0; $i<count($materials); $i++){
foreach($materials as $key => $value){
$dataArrMaterial[$i] = array(
'material_name' => $key,
'material_qty' => $value
);
} }
_print($dataArrMaterial);
我的输出如下。
Array(
[0] => Array
(
[material_name] => 1047
[material_qty] => 10
)
[1] => Array
(
[material_name] => 1047
[material_qty] => 10
)
[2] => Array
(
[material_name] => 1047
[material_qty] => 10
) )
现在请帮助我做到这一点。提前致谢。
你可以简化这个:
<?php
// ...
$dataArrMaterial = [];
foreach ($materials as $materialName => $materialQty) {
$dataArrMaterial[] = [
"material_name" => $materialName ,
"material_qty" => $materialQty
];
}
既然没有向你解释原因,我会的。
for($i=0; $i<count($materials); $i++){
foreach($materials as $key => $value){
// the value of $i is not changed within this loop
$dataArrMaterial[$i] = array('material_name' => $key, 'material_qty' => $value);
}
// when the for() loop starts again, $i is incremented
}
因此,在foreach循环的第一次迭代中,您将所有子数组分配给相同的$i
键(0
)。在1041
循环后,您的输出数组如下所示:
[0 => ["material_name" => 1041, "material_qty" => 30]];
在1046
之后,第一个推送子阵列被覆盖,因为同一级别的键必须是唯一的。
[0 => ["material_name" => 1046, "material_qty" => 10]];
然后第三个元素覆盖输出数组中的第二个元素:
[0 => ["material_name" => 1047, "material_qty" => 10]];
一旦内循环(foreach
)结束,外循环(for
)递增$i
并且“覆盖”过程重复输出数组的1
键。然后再次因为count($materials) = 3
(三次迭代)。
这就是为什么你要重复这样的最终值集:
[0 => ["material_name" => 1047, "material_qty" => 10]];
[1 => ["material_name" => 1047, "material_qty" => 10]];
[2 => ["material_name" => 1047, "material_qty" => 10]];
至于执行此任务的最佳方法,您可以使用我的重复链接中的解决方案,或者按照Arkascha的说明进行操作。