2013-06-06 2 views
0

У меня есть массив в PHP:Массив группировки в PHP

array (size=xxx) 
    0 => 
    array (size=9) 
     'cat' => string 'FIRST CAT' 
     'dur' => string '10' 
     'type' => string 'Type description 10' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 10-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    1 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '01:00' 
     'end' => string '02:00' 
     'desc' => string 'Event description 10-2' 
     'price' => string '' 
     'extra' => string '' 
    2 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '02:00' 
     'end' => string '03:00' 
     'desc' => string 'Event description 10-3' 
     'price' => string '' 
     'extra' => string '' 
    3 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '20' 
     'type' => string 'Type description 20' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 20-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    4 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '01:00' 
     'end' => string '02:00' 
     'desc' => string 'Event description 20-2' 
     'price' => string '' 
     'extra' => string '' 
    5 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string 'Type description 21' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 21-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    6 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '01:00' 
     'end' => string '02:00' 
     'desc' => string 'Event description 21-2' 
     'price' => string '' 
     'extra' => string '' 
    7 => 
    array (size=9) 
     'cat' => string 'SECOND CAT' 
     'dur' => string '10' 
     'type' => string 'Type description 100' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 100-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    8 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '01:00' 
     'end' => string '02:00' 
     'desc' => string 'Event description 100-2' 
     'price' => string '' 
     'extra' => string '' 
    9 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '20' 
     'type' => string 'Type description 200' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 200-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    10 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string '' 
     'start' => string '01:00' 
     'end' => string '02:00' 
     'desc' => string 'Event description 200-2' 
     'price' => string '' 
     'extra' => string '' 
    11 => 
    array (size=9) 
     'cat' => string '' 
     'dur' => string '' 
     'type' => string 'Type description 210' 
     'start' => string '00:00' 
     'end' => string '01:00' 
     'desc' => string 'Event description 210-1' 
     'price' => string 'xxx' 
     'extra' => string 'yyy' 
    etc... 

Мне нужно, чтобы сгруппировать этот массив сначала cat, затем dur, затем type. Этот массив type имеет две строки - price и extra и еще один массив, который будет состоять из всех данных о событиях - start, end и desc. Окончательный план массива (основанный на приведенном выше примере) должен выглядеть следующим образом:

'FIRST CAT'           // 'cat' 
    '10'            // 'dur' 
     'Type description 10', 'xxx', 'yyy'    // 'type', 'price', 'extra' 
      (array of events) 
      '00:00', '01:00', 'Event description 10-1' // 'start', 'end', 'desc' 
      '01:00', '02:00', 'Event description 10-2' // 'start', 'end', 'desc' 
      '02:00', '03:00', 'Event description 10-3' // 'start', 'end', 'desc' 
    '20' 
     'Type description 20', 'xxx', 'yyy' 
      (array of events) 
      '00:00', '01:00', 'Event description 20-1' 
      '01:00', '02:00', 'Event description 20-2' 
     'Type description 21', 'xxx', 'yyy' 
      (array of events) 
      '00:00', '01:00', 'Event description 21-1' 
      '01:00', '02:00', 'Event description 21-2' 
'SECOND CAT' 
    '10' 
     'Type description 100', 'xxx', 'yyy' 
      (array of events) 
      '00:00', '01:00', 'Event description 100-1' 
      '01:00', '02:00', 'Event description 100-2' 
    '20' 
     'Type description 200', 'xxx', 'yyy' 
      (array of events) 
      '00:00', '01:00', 'Event description 200-1' 
      '01:00', '02:00', 'Event description 200-2' 
     'Type description 210', 'xxx', 'yyy' 
      (array of events) 
      '00:00', '01:00', 'Event description 210-1' 
      '01:00', '02:00', 'Event description 210-2' 

Что бы самый простой способ, чтобы преобразовать свой существующий массив в одном мне нужно, в конце концов?

+0

Что вы уже пробовали? И что не удалось? –

+1

@ nl-x - http://meta.stackexchange.com/questions/122986/is-it-ok-to-leave-what-have-you-tried-comments –

+0

@ nl-x Я попытался следовать логике за этим сообщением http://stackoverflow.com/questions/12706359/php-array-group, но я немного смущен, потому что у моего исходного массива есть пустые значения ... – errata

ответ

1

Следующая делает то, что вы ищете:

$out = array(); 
foreach ($arr as $key => $value){ 
    $cat = $value['cat']; 
    $dur = $value['dur']; 
    $type = $value['type']; 
    $out[$cat][$dur][$type][] = $value['start'].', '.$value['end'].', '.$value['desc']; 
} 
print_r($out); 

EDIT:

Я изменил мой код из запроса на использование последней категории, когда категория пуста. Итак, вот мой модифицированный код:

$out = array(); 
    $last_cat = ''; 
    foreach ($arr as $key => $value){ 
     $cat = $value['cat']; 
     $dur = $value['dur']; 
     $type = $value['type']; 
     if (empty($cat)){ 
      $cat = $last_cat; 
     } else { 
      $last_cat = $cat; 
     } 
     $out[$cat][$dur][$type][] = $value['start'].', '.$value['end'].', '.$value['desc']; 
    } 
    print_r($out); 

вывод этого код выглядит следующим образом:

[FIRST CAT] => Array(
     [10] => Array(
      [Type description 10] => Array(
       [0] => 00:00, 01:00, Event description 10-1 
      ) 
     ) 
     [] => Array(
      [] => Array(
        [0] => 01:00, 02:00, Event description 10-2 
        [1] => 02:00, 03:00, Event description 10-3 
        [2] => 01:00, 02:00, Event description 20-2 
        [3] => 01:00, 02:00, Event description 21-2 
       ) 

      [Type description 21] => Array(
        [0] => 00:00, 01:00, Event description 21-1 
       ) 
     ) 
     [20] => Array(
      [Type description 20] => Array(
        [0] => 00:00, 01:00, Event description 20-1 
       ) 
     ) 
    ) 
[SECOND CAT] => Array(
     [10] => Array(
      [Type description 100] => Array(
        [0] => 00:00, 01:00, Event description 100-1 
       ) 
      ) 
     [] => Array(
      [] => Array(
        [0] => 01:00, 02:00, Event description 100-2 
        [1] => 01:00, 02:00, Event description 200-2 
       ) 
      [Type description 210] => Array(
        [0] => 00:00, 01:00, Event description 210-1 
       ) 
      ) 
     [20] => Array(
      [Type description 200] => Array(
        [0] => 00:00, 01:00, Event description 200-1 
       ) 
      ) 
    ) 
+0

Это очень полезно, но мой '$ out' имеет дополнительный массив« пустой категории »(' 'FIRST CAT'',' ''' и '' SECOND CAT'), который не желаемый выход. Теперь я вижу, как мне построить свой вывод и попробует его :) – errata

+0

Вы хотите удалить все данные с пустой catecory? В вашем исходном массиве было много данных без категории. –

+0

Нет, я не хочу это исключать, я бы хотел сгруппировать его по категории. – errata

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