Упростите вложенный массив в массив одного уровня

Возможный дубликат:
Как сгладить многомерный массив?

Предположим, у меня есть такой массив:

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; }