Как сделать foreach для массива массивов?


Как я могу сделать я foreach в массив массивов, как это:

array
(
    [option1] => 2
    [option2] => array
                 (
                     [name] => "ola mundo"
                     [id]   => "123456"
                     ...
                 )
    ...
)

массив может варьироваться от вариантов, и я хочу, чтобы напечатать все поля "name" найдены.

Примечание: желательно, как можно наиболее эффективно сделать.

 7
Author: Sergio, 2014-10-03

3 answers

PHP имеет интересные функции, которые применяет другой функции всех элементов массива.

Называет array_walk_recursive

Тест так:

$array = array(array('nome' => 'Luis', 'id' => 1), array('nome' => 'Rui', 'id' => 2));

$nomes = array();
array_walk_recursive($array, function ($item, $key) {
    global $nomes;
    if ($key == 'nome') $nomes[] = $item;
});

var_dump($nomes);

// resultado:
array(2) {
  [0]=>
  string(4) "Luis"
  [1]=>
  string(3) "Rui"
}

Пример онлайн здесь

Другая идея, чтобы сделать рекурсивную функцию, которая передает информацию в себе. Результат-это многомерный массив.

$array = array(array('nome' => 'Luis', 'id' => 1), array('nome' => 'Rui', 'id' => 2));

function recurse($array, $retorno){

    foreach ($array as $key => $item) {
        if (is_array($item)) $interno[] = recurse($item, $retorno);
        else if ($key == 'nome') $interno[] = $item;
    }
    if (count($retorno)) $retorno = array_merge($interno, $retorno);
    else $retorno = $interno;
    return $retorno;
}

var_dump(recurse($array, array()));

// resultado:
array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(4) "Luis"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "Rui"
  }
}

Пример онлайн здесь

 13
Author: Sergio, 2014-10-30 12:16:51

Можете сделать так:

   $ar = array
    (
        [option1] => 2
        [option2] => array
                     (
                         [name] => "ola mundo"
                         [id]   => "123456"
                         ...
                     )
        ...
    )

foreach($ar as $value)
{
   if(!is_array($value))
       continue;

   foreach($value as $v_key =>$v_value)
   {
        if($v_key=="name")
        {
           $nomes[] = $v_value;

        //se nesta array existir apenas uma chave nome para este loop e salta para o´
        //mais exterior
          continue 2;
        }


   }
}

, Если у вас есть php 5.5.0 можете использовать array_column http://php.net/manual/en/function.array-column.php

 2
Author: Manuel Gerardo Pereira, 2014-10-03 15:22:26

, Если это массив только с двух измерениях, как выход из базы данных, например, array_column - это самое простое решение:

<?php

$array = [
    ['nome' => 'Luis', 'id' => 31], 
    ['nome' => 'Rui', 'id' => 42],
    ['nome' => 'Joao', 'id' => 113],
    ['nome' => 'Joaquim', 'id' => 434],
    ['nome' => 'Jorge', 'id' => 503],
];

var_dump(array_column($array, 'nome'));

// Se quiser, pode aproveitar uma segunda coluna para usar como key do novo array
var_dump(array_column($array, 'nome', 'id'));

Например исполняемый.

Помня, что array_column - это одна из новинок php 5.5, но эта функция может использоваться легко в предыдущих версиях с помощью реализации на родном php.

Если ваш массив имеет еще более размеров, еще один способ это использовать RecursiveIteratorIterator, присутствует в SPL PHP.

<?php
    $array = [
        ['nome' => 'Luis', 'id' => 1], 
        ['nome' => 'Rui', 'id' => 2],
        ['nome' => 'Joao', 'id' => 3],
        ['nome' => 'Joaquim', 'id' => 4],
        ['nome' => 'Jorge', 'id' => 5],
    ];

    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));

    $nomes = [];

    foreach ($iterator as $key => $value)
        if ($key == 'nome') $nomes[] = $value;


    var_dump($nomes);

Например Исполняемый.

Ps.: Sergio, reaproveitei его Ideone ;)

 2
Author: gmsantos, 2014-10-30 15:57:41