Возможный дубликат:
Как сгладить многомерный массив?
Предположим, у меня есть такой массив:
array ( 1 => array ( 2 => array ( 16 => array ( 18 => array ( ), ), 17 => array ( ), ), ), 14 => array ( 15 => array ( ), ), )
Как я могу преобразовать его в массив?
array(1,2,16,18,17,14,15);
Извините за закрытие. Не обращал должного внимания на то, что вам нужны ключи. Решение ниже:
$iterator = new RecursiveIteratorIterator( new RecursiveArrayIterator($arr), RecursiveIteratorIterator::SELF_FIRST); $keys = array();
а затем либо
$keys = array(); foreach($iterator as $key => $val) { $keys[] = $key; }
или с экземпляром итератора напрямую
$keys = array(); for($iterator->rewind(); $iterator->valid(); $iterator->next()) { $keys[] = $iterator->key(); }
или сложнее, чем необходимо
iterator_apply($iterator, function(Iterator $iterator) use (&$keys) { $keys[] = $iterator->key(); return TRUE; }, array($iterator));
дает
Array ( [0] => 1 [1] => 2 [2] => 16 [3] => 18 [4] => 17 [5] => 14 [6] => 15 )
как насчет некоторой рекурсии
$result = array(); function walkthrough($arr){ $keys = array_keys($arr); array_push($result, $keys); foreach ($keys as $key) { if (is_array($arr[$key])) walkthrough($arr[$key]); else array_push($result,$arr[$key]); } return $result; }
walkthrouth ($ your_arr);
PS: Код можно прослушивать, но у вас есть идея 🙂
function flattenArray($array) { $arrayValues = array(); foreach (new RecursiveIteratorIterator( new RecursiveArrayIterator($array)) as $val) { $arrayValues[] = $val; } return $arrayValues; } // function flattenArrayIndexed()
Если мы рассмотрим вложенный массив как древовидную структуру, вы можете применить первый обход глубины, чтобы преобразовать его в список. То есть, в единый массив, который вы желаете.
Я искал все подобные вопросы, и кажется, что нет пути без рекурсии, которая сохранила бы порядок ключей без изменений.
Поэтому я просто пошел с классической рекурсией:
function getArrayKeysRecursive(array $theArray) { $aArrayKeys = array(); foreach ($theArray as $k=>$v) { if (is_array($v)) { $aArrayKeys = array_merge($aArrayKeys, array($k), getArrayKeysRecursive($v)); } else { $aArrayKeys = array_merge($aArrayKeys, array($k)); } } return $aArrayKeys; }