2016-08-23 2 views
0

어떻게 아래의 PHP에서 동일한 키, 값 쌍을 가진 2 배열을 병합 할 수 있습니다 반환 된 데이터입니다.동일한 키, 값 쌍을 가진 배열을 병합하는 방법

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" 
] 

는 I 배열을 병합 할 필요가 [0]과 배열 [1]과 동일한 배열 [5]과 배열 [6]이 동일한 그룹 키와 값을 모두 가지고 있기 때문이다. 나는 Laravel btw를 사용하고 있습니다.

+0

정말 중복 제거를 의미합니까? – tam5

+0

'array_unique ($ yourArray, SORT_REGULAR) '를 호출하면 중복 된 항목이없는 새로운 배열이 반환됩니다. Laravel을 사용한다고 언급 했으므로이 배열을 만들 때 처음부터 중복이 생성되는 것을 방지 할 수 있는지 알아 보는 것이 좋습니다. – tam5

+0

일종의 중복 제거,하지만 내 경우에는 그것을 병합해야합니다 왜냐하면 내가 그 짧은 작업을 유지해야합니다. 배열 [0]에는 1 그룹 2 개와 2 개 작업이 있어야합니다. – PenAndPapers

답변

1

다음과 같이 시도해 볼 수 있습니다. 배열에서 동일한 그룹 ID를 가진 항목을 탐지합니다. 그런 다음 병합 할 항목이나 키를 병합하십시오.

여기서는 array_merge_recursive를 사용하지만 ID와 이름 필드를 배열로 병합하여 그룹 키를 대체합니다. 그러나 여기서주의해야합니다. 병합하고자하는 것을보다 명확하게 표현하고자 할 수 있습니다. 아마도 당신의 경우에 단지 작업과 요약.

<?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', 
    ), 
), 
) 
+0

감사합니다. @Progrock – PenAndPapers

0

당신은 Laravel 컬렉션 unique method를 사용할 수 있습니다.

고유 한 것을 정의 할 키를 설정할 수 있습니다.

중첩 된 속성을 선택하여 도트 구문과 병합 할 수 있습니다. 즉 group.id입니다.

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