如何使用相同的键,值对合并数组

时间:2016-08-23 03:06:46

标签: php arrays laravel sorting array-merge

如何将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"
]

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

2 个答案:

答案 0 :(得分: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',
    ),
  ),
)

答案 1 :(得分:0)

您可以使用Laravel Collection unique method

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

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

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