Так как вам не объяснили почему , я буду.
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]];
Что касается лучшего способа выполнить эту задачу, вы можете использовать решение из моей дублированной ссылки или сделать это, как продемонстрировал Аркаша.