【问题标题】:Group array values with same key if specific keys match如果特定键匹配,则使用相同键对数组值进行分组
【发布时间】:2020-08-23 16:10:49
【问题描述】:

我有这个数组:

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

        )

)

我不知道如何得到这个结果。有什么想法吗?

【问题讨论】:

  • 看起来您需要遍历第一个数组,创建一个按材质名称索引的输出数组,并将数据添加到适当的数组槽中。尝试将任何尝试的代码添加到您遇到的问题中。
  • 将尝试采用这种方式。

标签: php arrays join merge match


【解决方案1】:

您必须在此处使用array_merge_recursive() 函数来防止覆盖相同的键。 通过防止覆盖,它实际上为值创建了一个数组。

<?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 '</pre>';
?>

【讨论】:

  • 我明白了。所以首先我需要将每个数组提取到变量中,然后继续你的建议。将数组从数组提取到变量的最佳方法是什么?
  • 您可以为此目的使用 foreach。
【解决方案2】:

我是这样解决的:

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

【讨论】:

  • 这不是一种有效的方法。
  • 我猜,找不到更好的方法来实现。有什么改进建议吗?
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 2022-06-10
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2021-11-07
相关资源
最近更新 更多