微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP合并具有相似键的数组,并对一些键求和

如何解决PHP合并具有相似键的数组,并对一些键求和

在打扰这个很棒的社区之前,我真的为此挣扎了一天多,但我没有运气。

我有一个看起来像这样的数组

$Data = [
  [
   'code' => 'P-01','firstname' => 'Sam','lastname' => 'Bouchard','quantity' => 3
  ],[
   'code' => 'P-09','firstname' => 'Roy','lastname' => 'Gauthier','quantity' => 14
  ],[
   'code' => 'P-24','firstname' => 'Marin','lastname' => 'Fortin','quantity' => 24
  ],[
   'code' => 'P-03','quantity' => 7
  ],[
   'code' => 'P-01','quantity' => 9
  ],];

所以我想合并数组所以我有这样的数组

$Data = [
  [
   'firstname' => 'Sam','combined' => [
     'code' => 'P-01','quantity' => 12 
   ],[
     'code'=> 'P-03','quantity' => 7
   ]
  ],[
   'firstname' => 'Roy','combined' => [
     'code' => 'P-09','quantity' => 14 
   ]
  ],[
   'firstname' => 'Marin','combined' => [
     'code' => 'P-24','quantity' => 24
   ]
  ],];

如您所见,如果“代码”相同,我需要对数量求和。 提前致谢

解决方法

在以下示例中,您将获得具有唯一代码键的新合并数组。此外,它将前一个数量添加到下一个。

$Merged = [];
foreach ($Data as $value) {
  if (isset($Merged[$value['code']])) {
    $Merged[$value['code']]['quantity'] += $value['quantity'];
  } else {
    $Merged[$value['code']] = $value;
  }
}

输出

Array
(
    [P-01] => Array
        (
            [code] => P-01
            [firstname] => Sam
            [lastname] => Bouchard
            [quantity] => 12
        )

    [P-09] => Array
        (
            [code] => P-09
            [firstname] => Roy
            [lastname] => Gauthier
            [quantity] => 14
        )

    [P-24] => Array
        (
            [code] => P-24
            [firstname] => Marin
            [lastname] => Fortin
            [quantity] => 24
        )

    [P-03] => Array
        (
            [code] => P-03
            [firstname] => Sam
            [lastname] => Bouchard
            [quantity] => 7
        )

)
,

输入数据

请注意,您显示的数组在格式方面存在一些错误(可能是拼写错误)。我们将使用:

$data = [
  [
   'code' => 'P-01','firstname' => 'Sam','lastname' => 'Bouchard','quantity' => 3
  ],[
   'code' => 'P-09','firstname' => 'Roy','lastname' => 'Gauthier','quantity' => 14
  ],[
   'code' => 'P-24','firstname' => 'Marin','lastname' => 'Fortin','quantity' => 24
  ],[
   'code' => 'P-03','quantity' => 7
  ],[
   'code' => 'P-01','quantity' => 9
  ]
];

变换数组

首先,我们想将数组转换为一个我们可以轻松使用的数据结构,同时我们可以组合和更新数量。

在这种情况下,我们将重新组织三个级别的索引firstname -> lastname -> code

// Define the array for output of transformation
$firstnameIndexArray = [];

// Loop through all current data points
foreach($data as $point){

    // Set a pointer by reference to decrease the length of the next line(!) hopefully 
    // making it more readable
    $pointer   = &$firstnameIndexArray[$point['firstname']][$point['lastname']][$point['code']];

    // Update the quantity
    // $pointer ?? 0... sets to 0 if $pointer doesn't contain a value/exist
    $pointer   = ($pointer ?? 0) + $point["quantity"];
}

现在我们已经完成了,我们有一个看起来像这样的数组:

Array
(
    [Sam] => Array
        (
            [Bouchard] => Array
                (
                    [P-01] => 12
                    [P-03] => 7
                )

        )

    [Roy] => Array
        (
            [Gauthier] => Array
                (
                    [P-09] => 14
                )

        )

    [Marin] => Array
        (
            [Fortin] => Array
                (
                    [P-24] => 24
                )

        )

)

以正确的格式重新制作数组

现在剩下要做的就是遍历转换后的数组并以我们选择的格式输出...

// Define the output array
$finalArray = [];

// Loop through first level of array
foreach($firstnameIndexArray as $firstname => $lastnameIndexarray){

    // Loop through second level of array
    foreach($lastnameIndexarray as $lastname => $codeIndexArray){

        // Define the combined array of code/value pairs
        $combinedArray = [];

        // Loop though each code/value pair
        foreach($codeIndexArray as $code => $quantity){

            // Make the combined array in the correct format
            $combinedArray[] = [
                'code'     => $code,'quantity' => $quantity
            ];
        }

        // Add the person to the final array
        $finalArray[] = [
            'firstname' => $firstname,'lastname' => $lastname,'combined' => $combinedArray
        ];
    }
}

输出如下:

Array
(
    [0] => Array
        (
            [firstname] => Sam
            [lastname] => Bouchard
            [combined] => Array
                (
                    [0] => Array
                        (
                            [code] => P-01
                            [quantity] => 12
                        )

                    [1] => Array
                        (
                            [code] => P-03
                            [quantity] => 7
                        )

                )

        )

    [1] => Array
        (
            [firstname] => Roy
            [lastname] => Gauthier
            [combined] => Array
                (
                    [0] => Array
                        (
                            [code] => P-09
                            [quantity] => 14
                        )

                )

        )

    [2] => Array
        (
            [firstname] => Marin
            [lastname] => Fortin
            [combined] => Array
                (
                    [0] => Array
                        (
                            [code] => P-24
                            [quantity] => 24
                        )

                )

        )

)

没有注释的代码

$firstnameIndexArray = [];
foreach($data as $point){
    $pointer   = &$firstnameIndexArray[$point['firstname']][$point['lastname']][$point['code']];
    $pointer   = ($pointer ?? 0) + $point["quantity"];
}

$finalArray = [];
foreach($firstnameIndexArray as $firstname => $lastnameIndexarray){
    foreach($lastnameIndexarray as $lastname => $codeIndexArray){
        $combinedArray = [];
        foreach($codeIndexArray as $code => $quantity){
            $combinedArray[] = [
                'code'     => $code,'quantity' => $quantity
            ];
        }
        $finalArray[] = [
            'firstname' => $firstname,'combined' => $combinedArray
        ];
    }
}
,

可能的方法是使用“代码”作为新数组的索引:

创建一个新的结果数组

$combined = [];

遍历 $Data 并将每个项目放入 $item 对于每个 $item 将代码作为 $key 检查组合数组中是否已有值与该 $key

if (isset($combined[$key]))) {...}

如果没有,使用该 $key 将项目添加到数组

$newItem = $this->createNewStructureFromItem($item);
$combined[$key] = $newItem;

如果组合数组中已经有那个键,只更新数量

$existingItem = $combined[$key];
$updatedItem = $this->increaseQuantity($existingItem,$item);
$combined[$key] = $updatedItem;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。