【问题标题】:how to merge array with same key, value pair如何合并具有相同键值对的数组
【发布时间】:2016-12-29 17:21:03
【问题描述】:

如何合并2个具有相同键的数组,下面的PHP中的值对是返回的数据。

array:8
  0 => array:3
    "group" => array:2
      "id" => 1
      "name" => "data 1"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  1 => array:3
    "group" => array:2
      "id" => 1
      "name" => "data 1"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  2 => array:3
  3 => array:3
  4 => array:3
  5 => array:3
    "group" => array:2
      "id" => 6
      "name" => "data 5"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  6 => array:3
    "group" => array:2
      "id" => 6
      "name" => "data 5"
    ]
    "brief" => array:5
    "tasks" => array:1
  ]
  "totalHours" => "31"
]

我需要将数组 [0] 和数组 [1] 与数组 [5] 和数组 [6] 合并,因为它们具有相同的组键和值。顺便说一句,我正在使用 Laravel。

【问题讨论】:

  • 所以你真的只是指删除重复项吗?
  • 如果您调用array_unique($yourArray, SORT_REGULAR),您将返回一个没有重复条目的新数组。既然您提到您使用的是 Laravel,那么看看您是否可以在创建此数组时首先防止创建重复项可能是值得的。
  • 有点删除重复项,但在我的情况下,我需要合并它,因为我需要保留它的简介和任务。所以在 array[0] 中应该有 1group 2 brief 和 2 tasks

标签: php arrays laravel sorting array-merge


【解决方案1】:

您可以尝试以下方法。检测数组中的哪些项目具有相同的组 ID。然后合并那些项目或要合并的键。

这里我使用了array_merge_recursive,但是它将id和name字段合并到一个数组中,因此替换了组键。但是在这里要小心,您可能希望更明确地说明您希望合并的内容。也许只是你的情况下的任务和简介。

<?php
$items = [
    [
        'group' => [
            'id' => '23',
            'name' => 'peach'
            ],
        'tasks' => ['foo', 'bar']
    ],
    ['big', 'fat', 'mamma'],
    [
        'group' => [
            'id' => '23',
            'name' => 'peach'
            ],
        'tasks' => ['baz', 'bat']
    ],
];

$groupIds = [];
foreach($items as $key => $item) {
    if(isset($item['group'])) {
        $groupIds[$item['group']['id']][] = $key;
    }
}

foreach($groupIds as $group_id => $item_keys) {
    $merged_item = array();
    foreach($item_keys as $key) {
        $merged_item = array_merge_recursive($merged_item, $items[$key]);
        $merged_item['group'] = $items[$key]['group'];
        unset($items[$key]);
    }
    array_push($items, $merged_item);
}

var_export($items);

输出:

array (
  1 => 
  array (
    0 => 'big',
    1 => 'fat',
    2 => 'mamma',
  ),
  3 => 
  array (
    'group' => 
    array (
      'id' => '23',
      'name' => 'peach',
    ),
    'tasks' => 
    array (
      0 => 'foo',
      1 => 'bar',
      2 => 'baz',
      3 => 'bat',
    ),
  ),
)

【讨论】:

    【解决方案2】:

    你可以使用 Laravel Collection unique method

    这允许您设置一个键来定义什么是唯一的。

    您可以使用点语法选择要合并的嵌套属性。即group.id

    $merged = collect($original)->unique('group.id');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多