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

Это не будет работать, если оно будет больше 1 значения в '$ 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 в порядке их появления во входном массиве. Для размещенного массива, они будут 1 и 2. Если вы не заботитесь о клавишах, удалите вызов array_values(), чтобы немного улучшить скорость и удобство чтения.

Функция array_values() отбрасывает ключи и возвращает массив, индексированный с использованием последовательных числовых клавиш, начинающихся с нуля (как указано в вопросе).

+0

Пожалуйста, не писать только коды. Объясните свой код. –

+0

Отличный совет. Этот ответ был опубликован в мой второй день на [так]. Где ты был тогда? :-) – axiac

Смежные вопросы