2014-11-21 1 views
-2

아래에 나열된 배열이 있습니다.PHP에서 배열 그룹화 및 병합

$array = array(
     '0' => array(
      'names' => array(0 => 'Apple'), 
      'group' => 1 
     ), 
     '1' => array(
      'names' => array(0 => 'Mango'), 
      'group' => 1 
     ), 
     '2' => array(
      'names' => array(0 => 'Grapes'), 
      'group' => 1 
     ), 
     '3' => array(
      'names' => array(0 => 'Tomato'), 
      'group' => 2 
     ), 
     '4' => array(
      'names' => array(0 => 'Potato'), 
      'group' => 2 
     ) 
    ); 

는 I 배열 키 "그룹"의 값이 동일한 경우, 그 키 "이름"의 값이 병합되어야하는 방식의 결과를 원한다. 아래에 언급 된 결과를 원합니다.

$array = array(
     '0' => array(
      'names' => array(0 => 'Apple', 1 => 'Mango', 2 => 'Grapes'), 
      'group' => 1 
     ), 
     '1' => array(
      'names' => array(0 => 'Tomato', 1 => 'Potato'), 
      'group' => 2 
     ) 
    ); 

답변

-1
<?php 
    //initialize our array 
    $array = array(
     '0' => array(
      'names' => array(0 => 'Apple'), 
      'group' => 1 
     ), 
     '1' => array(
      'names' => array(0 => 'Mango'), 
      'group' => 1 
     ), 
     '2' => array(
      'names' => array(0 => 'Grapes'), 
      'group' => 1 
     ), 
     '3' => array(
      'names' => array(0 => 'Tomato'), 
      'group' => 2 
     ), 
     '4' => array(
      'names' => array(0 => 'Potato'), 
      'group' => 2 
     ) 
    ); 
    //result will be here 
    $result = array(); 

    foreach ($array as $key => $value) { 
     //check if we have keys group or names to avoid errors 
     if(!isset($value['group']) || !isset($value['names'])) 
      continue; 

     //make a key in result array if its not exist 
     if(!isset($result[$value['group']])) 
     { 
      $result[$value['group']] = $value['names']; 
     } 
     else 
     { 
      //add a values to key if it exists 
      $result[$value['group']] = array_merge($result[$value['group']], 
       $value['names']); 
      //filter same values 
      $result[$value['group']] = array_values(array_unique($result[$value['group']])); 
     } 
    } 
    print_r($result); 
-1

당신은 배열을 반복하고 그룹에 별도의 배열에 모든 것을 저장할 수 있습니다. 그 후, 당신은 같은, 당신이 그것을 원하는 형식으로 출력 배열을 만들 수 있습니다

$groups = array(); 
foreach($array as $subArray) { 
    if (!array_key_exists($subArray['group'], $groups)) { 
     $groups[$subArray['group']] = array(); 
    } 
    $groups[$subArray['group']] = array_merge($groups[$subArray['group']], $subArray['names']); 
} 

$result = array(); 
foreach($groups as $groupId => $group) { 
    $result[] = array(
     'names' => $group, 
     'group' => $groupId, 
    ); 
} 

print_r($result); 
+0

'$ subArray [ 'names']' – fiction

+0

@fiction에서 값이 두 개 이상이면 제대로 작동하지 않습니다. (하지만이 요구 사항은 아니었지만 지금은 무엇입니까?) – RichardBernards

-1

PHP 함수 array_reduce()위한 완벽한 사용 예 :

$array = array_values(
    array_reduce(
     $array, 
     function (array $carry, array $item) { 
      // Extract the group name into a variable for readability 
      // and speed; it is used several times velow 
      $key = $item['group']; 
      // Initialize the group if it is the first entry in this group    if (! array_key_exists($key, $carry)) { 
       $carry[$key] = array(
        'names' => array(), 
        'group' => $key, 
       ); 
      } 
      // Add the new names to the group in the output array 
      $carry[$key]['names'] = array_merge($carry[$key]['names'], $item['names']); 

      // Return the partial result 
      return $carry; 
     }, 
     array() 
    ) 
); 

코드가 반복적으로 구축 array_reduce()를 사용을 기대되는 값을 포함한 새로운 배열.

콜백 함수는 필요한 경우 그룹을 만들고 처리 된 항목의 이름을 결과 배열의 기존 그룹에 병합합니다.

array_reduce()을 사용하여 생성 된 배열은 입력 배열에 나타나는 순서대로 group의 값을 사용하여 색인화됩니다. 게시 된 배열의 경우 키는 12이됩니다. 키에 신경 쓰지 않는다면 array_values()으로 전화를 제거하면 속도와 가독성이 약간 향상됩니다.

함수 array_values()은 0을 시작으로하는 순차 숫자 키 (질문에 나열된 키)를 사용하여 인덱싱 된 배열을 반환하고 배열을 반환합니다.

+0

그냥 코드를 작성하십시오. 또한 코드를 설명하십시오. –

+0

훌륭한 조언. 이 답변은 내 둘째 날에 [so]에 게시되었습니다. 그 때 어디 있었 니? :-) – axiac