Как сделать foreach для массива массивов?
Как я могу сделать я foreach
в массив массивов, как это:
array
(
[option1] => 2
[option2] => array
(
[name] => "ola mundo"
[id] => "123456"
...
)
...
)
массив может варьироваться от вариантов, и я хочу, чтобы напечатать все поля "name" найдены.
Примечание: желательно, как можно наиболее эффективно сделать.
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"
}
}
Можете сделать так:
$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
, Если это массив только с двух измерениях, как выход из базы данных, например, 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 ;)