2014-11-21 142 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 
     ) 
    ); 

我想要的結果以這樣的方式使得如果陣列鍵「組」的值相同,則關鍵的「名字」的值應該被合併。我想要下面提到的輸出。

$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 2014-11-21 09:50:11

+0

@fiction現在它不會正常工作(但這不是要求,現在是它?) – RichardBernards 2014-11-21 10:02:02

-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

請不要只寫代碼。也解釋你的代碼。 – 2017-08-23 06:23:54

+0

優秀的建議。這個答案在我的第二天發佈在[so]上。你那時在哪裏? :-) – axiac 2017-08-23 08:23:31