2017-01-17 5 views
-2

Для простоты у меня есть массив:Перебор массива и создание многомерной

Array (
[0] => Array 
    (
     [content] => Item One 
     [type] => Breakfast 
    ) 
[1] => Array 
    (
     [content] => Item Two 
     [type] => Breakfast 
    ) 
[2] => Array 
    (
     [content] => Item One 
     [type] => Lunch 
    ) 
[3] => Array 
    (
     [content] => Item One 
     [type] => Dinner 
    ) 
) 

Что является наиболее эффективным способом, чтобы создать новый многомерный массив, где сочетались бы на соответствие ключа «типа»? Как показано ниже. Текущая попытка в foreach. Есть ли встроенные функции для этого?

Array (
[0] => Array 
    (
     [content] => Item One 
     [type] => Breakfast 
    ), 
    (
     [content] => Item Two 
     [type] => Breakfast 
    ) 
[1] => Array 
    (
     [content] => Item One 
     [type] => Lunch 
    ), 
[2] => Array 
    (
     [content] => Item One 
     [type] => Dinner 
    ) 
) 
+1

Вы можете поделиться тем, что вы пробовали? –

+0

В настоящее время я делаю это с циклом foreach и проверяя тип, когда я перебираю и если тип изменился, делайте что-то, но оно получило действительно уродливое. –

+0

Не указывая нам, что вы ожидаете от вывода, и не показывая нам, что вы пробовали, вряд ли вы получите ответ, когда кто-то просто выдает код для вас. –

ответ

3

Вам необходимо пройти через массив ввода и создать новый выходной массив. Посмотрите на этом простом примере:

<?php 
$input = [ 
    [ 
     'content' => 'Item One', 
     'type' => 'Breakfast', 
    ], 
    [ 
     'content' => 'Item Two', 
     'type' => 'Breakfast', 
    ], 
    [ 
     'content' => 'Item Three', 
     'type' => 'Lunch', 
    ], 
    [ 
     'content' => 'Item Four', 
     'type' => 'Dinner', 
    ] 
]; 
$output = []; 

array_walk(
    $input, 
    function($element) use (&$output) { 
     $output[$element['type']][] = $element; 
    } 
); 
print_r($output); 

Выход выше очевидно:

Array 
(
    [Breakfast] => Array 
     (
      [0] => Array 
       (
        [content] => Item One 
        [type] => Breakfast 
       ) 

      [1] => Array 
       (
        [content] => Item Two 
        [type] => Breakfast 
       ) 

     ) 

    [Lunch] => Array 
     (
      [0] => Array 
       (
        [content] => Item Three 
        [type] => Lunch 
       ) 

     ) 

    [Dinner] => Array 
     (
      [0] => Array 
       (
        [content] => Item Four 
        [type] => Dinner 
       ) 

     ) 

) 

Конечно, вы можете поместить любой элемент и структура вы хотите внутри созданного массива. В этом примере я просто принял исходные элементы, поскольку это не имеет значения для демонстрации того, как легко итерации через массив.

Если вы настаиваете на числовой последовательности клавиш в выходном массиве, то вы можете просто использовать print_r(array_values($output)); вместо print_r($output) ...

+1

Интересно ... array_walk ... никогда раньше не видел этого. принимает массив, обратный вызов и пользовательские данные. Это здорово! –

+0

@CoolShape Yep, делает ваш код более легким в моем взгляде ... – arkascha

0

Вы можете цикл через него, и подтолкнуть их в новый массив с помощью TYPE

например:

$newitmes = []; 
foreach($arr as $item){ 
    $type = $item['type']; 
    $newitmes[$type][] = $item; 
} 
print_r($newitmes); 

Надеюсь, это ответит на ваш вопрос.

+1

Кажется, вы не тестировали свой собственный код ... '$ iem'! =' $ Item', а орфография в '$ newitmes' есть, хорошо ... "creative" ;-) – arkascha

+0

Спасибо, что заметили. –

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