2014-11-21 138 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