Как создать массив с ассоциативными подмассивами из одномерного массива? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть следующий массив.

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
    ) )

теперь, пожалуйста, помогите мне сделать это. заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Так как вам не объяснили почему , я буду.

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]];

Что касается лучшего способа выполнить эту задачу, вы можете использовать решение из моей дублированной ссылки или сделать это, как продемонстрировал Аркаша.

0 голосов
/ 07 сентября 2018

Вы можете упростить это довольно много:

<?php
// ...
$dataArrMaterial = [];
foreach ($materials as $materialName => $materialQty) {
    $dataArrMaterial[] = [
        "material_name" => $materialName ,
        "material_qty" => $materialQty
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...