Сгруппировать значения массива с одинаковым ключом, если указано совпадение c ключей - PullRequest
0 голосов
/ 08 мая 2020

У меня есть этот массив массивов:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [rawMaterialName] => Item1
                    [rawMaterialQuantity] => 560
                    [rawMaterialPrice] => 1250.00
                    [rawMaterialDate] => 2020-05-03
                    [rawMaterialDocument] => AA-00000001
                )

            [1] => Array
                (
                    [id] => 2
                    [rawMaterialName] => Item2
                    [rawMaterialQuantity] => 19
                    [rawMaterialPrice] => 250.00
                    [rawMaterialDate] => 2020-05-04
                    [rawMaterialDocument] => AA-00000002

                )

            [2] => Array
                (
                    [id] => 3
                    [rawMaterialName] => Item3
                    [rawMaterialQuantity] => 260
                    [rawMaterialPrice] => 870.00
                    [rawMaterialDate] => 2020-05-05
                    [rawMaterialDocument] => AA-00000003
                )

            [3] => Array
                (
                    [id] => 4
                    [rawMaterialName] => Item2
                    [rawMaterialQuantity] => 43
                    [rawMaterialPrice] => 480.00
                    [rawMaterialDate] => 2020-05-06
                    [rawMaterialDocument] => AA-00000004
                )

            [4] => Array
                (
                    [id] => 5
                    [rawMaterialName] => Item3
                    [rawMaterialQuantity] => 310
                    [rawMaterialPrice] => 5100.00
                    [rawMaterialDate] => 2020-05-07
                    [rawMaterialDocument] => AA-00000005
                )

            [5] => Array
                (
                    [id] => 6
                    [rawMaterialName] => Item1
                    [rawMaterialQuantity] => 14
                    [rawMaterialPrice] => 830.00
                    [rawMaterialDate] => 2020-05-08
                    [rawMaterialDocument] => AA-00000006
                )

        )

)

Мне нужно сгруппировать значения с одним и тем же ключом, если rawMaterialName значения ключей совпадают. Надеюсь получить такой результат:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [id] => Array
                        (
                            [0] => 1
                            [1] => 6
                        )
                    [rawMaterialName] => Item1
                    [rawMaterialQuantity] => Array
                        (
                            [0] => 560
                            [1] => 14
                        )
                    [rawMaterialPrice] => Array
                        (
                            [0] => 1250.00
                            [1] => 830.00
                    [rawMaterialDate] => Array
                        (
                            [0] => 2020-05-03
                            [1] => 2020-05-08
                    [rawMaterialDocument] => Array
                        (
                            [0] => AA-00000001
                            [1] => AA-00000006
                )

            [1] => Array
                (
                    [id] => Array
                        (
                            [0] => 2
                            [1] => 4
                        )
                    [rawMaterialName] => Item2
                    [rawMaterialQuantity] => Array
                        (
                            [0] => 19
                            [1] => 43
                        )
                    [rawMaterialPrice] => Array
                        (
                            [0] => 250.00
                            [1] => 480.00
                        )
                    [rawMaterialDate] => Array
                        (
                            [0] => 2020-05-04
                            [1] => 2020-05-06
                    [rawMaterialDocument] => Array
                        (
                            [0] => AA-00000002
                            [1] => AA-00000004
                        )

                )

            [2] => Array
                (
                    [id] => Array
                        (
                            [0] => 3
                            [1] => 5
                        )
                    [rawMaterialName] => Item3
                    [rawMaterialQuantity] => Array
                        (
                            [0] => 260
                            [1] => 310
                        )
                    [rawMaterialPrice] => Array
                        (
                            [0] => 870.00
                            [1] => 5100.00
                        )
                    [rawMaterialDate] => Array
                        (
                            [0] => 2020-05-05
                            [1] => 2020-05-07
                        )
                    [rawMaterialDocument] => Array
                        (
                            [0] => AA-00000003
                            [1] => AA-00000005
                        )
                )

        )

)

Я не могу понять, как получить этот результат. Есть мысли?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Вы должны использовать здесь функцию array_merge_recursive(), чтобы предотвратить переопределение тех же ключей. И, предотвращая переопределение, он фактически создает массив для значений.

<code><?php
$array = [
$arr1 =  [
'id' => 1,
'rawMaterialName' => 'Item1',
'rawMaterialQuantity' => 560,
'rawMaterialPrice' => 1250.00,
'rawMaterialDate' => '2020-05-03',
'rawMaterialDocument' => 'AA-00000001'
],
$arr2 = [
'id' => 6,
'rawMaterialName' => 'Item1',
'rawMaterialQuantity' => 14,
'rawMaterialPrice' => 830.00,
'rawMaterialDate' => '2020-05-08',
'rawMaterialDocument' => 'AA-00000006'
 ]
];
$result = [];
$result = array_merge_recursive($arr1,$arr2); 
echo '<pre>';
print_r($result);
echo '
'; ?>
0 голосов
/ 08 мая 2020

Решил вот так:

$newArray = array();
foreach ($data as $element) {
  $newArray[$element['rawMaterialName']]['rawMaterialName'] = $element['rawMaterialName'];
  $newArray[$element['rawMaterialName']]['id'][] = $element['id'];
  $newArray[$element['rawMaterialName']]['rawMaterialQuantity'][] = $element['rawMaterialQuantity'];
  $newArray[$element['rawMaterialName']]['rawMaterialPrice'][] = $element['rawMaterialPrice'];
  $newArray[$element['rawMaterialName']]['rawMaterialDate'][] = $element['rawMaterialDate'];
  $newArray[$element['rawMaterialName']]['rawMaterialDocument'][] = $element['rawMaterialDocument'];
}

$finalArray = array_values($newArray);
...