Я пытаюсь получить все значения массива многомерного массива, но вещь – массив может быть 1 уровень глубокой или 2, 3 или 4, т. е. n уровней.
вот некоторые случайные, например, содержимое массива.
EG1
Array ( [0] => Array ( [0] => name0 ) [1] => Array ( [0] => name1 ) [2] => Array ( [0] => name2 ) [3] => Array ( [0] => name3 ) [4] => Array ( [0] => name4 ) [5] => Array ( [0] => name4 ) [6] => Array ( [0] => name5 ) )
ЭГ2
Array ( [0] => Array ( [0] => name0 [1] => name1 [2] => name2 [3] => name3 [4] => name4 [5] => name5 ) )
Я хочу, чтобы все значения находились в новом массиве. До сих пор я пробовал что-то вроде этого.
цикл за n раз, используя foreach
loop, теперь он отлично работает, но я хотел бы знать, правильно ли он программно исправлен или есть какой-либо другой способ, который быстрее или лучше этого.
PHP-код.
<?php $out_final_array = array (); function foreach_values_endless($array){ global $out_final_array; /* if its array */ if(is_array($array)){ /*run foreach loop to find more sub arrays */ foreach ($array as $value){ /* if value is an array send to own custom function */ if(is_array($value)){ $out_final_array[] = foreach_values_endless(array_values($value)); }else{ /* value is not an array*/ $out_final_array[] = $value; } } }else{ /* value is not array */ $out_final_array[] = $array; } }
Если вам нужно сгладить его, другим способом будет использование SPL RecursiveArrayIterator
и RecursiveIteratorIterator
:
$new_data = array(); $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); foreach($it as $v) { $new_data[] = $v; }
Образец вывода
Sidenote: нет необходимости в этом global
просто return
значения:
function foreach_values_endless($array){ $data = array(); foreach ($array as $k => $v) { if (is_array($v)) { $data = array_merge($data, foreach_values_endless($v)); } else { $data[] = $v; } } return $data; }
Образец вывода
Вы можете использовать array_walk_recursuve()
:
$final = array(); array_walk_recursive($input, function($item, $key) use (&$final){ $final[0][] = $item; });
Это должно сработать для вас:
Просто выполните все ваши значения с помощью array_walk_recursive()
, например:
$result = []; array_walk_recursive($arr, function($v, $k)use(&$result){ $result[] = $v; }); print_r($result);