【问题标题】:Merge subarrays of multidimensional array based on sub value根据子值合并多维数组的子数组
【发布时间】:2021-02-05 15:39:07
【问题描述】:

我有一个这样的多维数组,我需要合并具有相同 messageID 值的子数组。


$myarray = Array (

    [0] => Array
        (
            [messageId] => 5ACE9D8841
            [sender] => john@doe.com
        )

    [1] => Array
        (
            [messageId] => 7EE67D8170
            [sender] => dan@doe.com
        )

    [2] => Array
        (
            [messageId] => 8095FD8836
            [sender] => cat@doe.com
        )

    [3] => Array
        (
            [messageId] => 7EE67D8170
            [dest] => mitch@doe.com
            [status] => sent
            [date] => 2021-02-01 11:06:55
        )
);

预期结果,[1] 和 [3] 合并为 [1],因为它们共享相同的 [messageId]:


Array
(
    [0] => Array
        (
            [messageId] => 5ACE9D8841
            [sender] => john@doe.com
        )

    [1] => Array
        (
            [messageId] => 7EE67D8170
            [dest] => mitch@doe.com
            [status] => sent
            [date] => 2021-02-01 11:06:55
            [sender] => dan@doe.com
        )

    [2] => Array
        (
            [messageId] => 8095FD8836
            [sender] => cat@doe.com
        )
)

我不介意键索引或顺序。

编辑:我尝试过 array_merge、array_merge_recursive 和许多其他方法。获得了最佳结果


        foreach ($myarray as $sub_arr) {

            $result_arr = array_merge($result_arr, $sub_arr);

            $result_arr = array_unique($result_arr);


        } 

它可以工作,但只返回最后一次迭代:

Array
        (
            [messageId] => 7EE67D8170
            [dest] => mitch@doe.com
            [status] => sent
            [date] => 2021-02-01 11:06:55
            [sender] => dan@doe.com
        )

问候

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 欢迎来到 Stack Overflow。虽然我们很乐意在您遇到困难时提供帮助,但您仍然需要为找到解决方案做出自己的努力。这是迭代一个数组以创建一个新数组的简单任务。如果您已经尝试过某事,请编辑您的问题以展示您的最佳尝试,并说明它在哪里以及如何未能满足您的需求。
  • @El_Vanja Ty,我已经编辑了我的帖子。
  • @FelippeDuarte 我已经编辑了我的帖子,我自己尝试了一整天。
  • 你的问题的核心是你试图在每次迭代中无条件地合并。您应该仅在满足特定条件(ID 匹配)时才合并。否则,您需要做的就是将元素原样添加到结果数组中。您可以使用消息 id 作为结果数组中的键,因此很容易识别该消息 id 是否已经存在于结果中并且应该合并。

标签: php arrays multidimensional-array array-merge


【解决方案1】:

尝试使用带有回调函数的array_reduce函数:

$result = array_values(array_reduce($myarray, function($rows, $item){
    if (array_key_exists('messageId', $item) && is_scalar($item['messageId'])) {
        $rows = array_replace_recursive($rows ?? [], [$item['messageId'] => $item]);
    }
    return $rows;
}));

print_r($result);

fiddle

【讨论】:

  • 您好,非常感谢您的帮助。在小提琴示例中,我认为它几乎很好,但是 messageId 7EE67D8170 缺少发件人('sender' => 'dan@doe.com')
  • 我已经更新了答案和小提琴。应该有一个函数array_replace_recursive 而不是array_merge
猜你喜欢
  • 1970-01-01
  • 2020-08-05
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
相关资源
最近更新 更多