2010-11-19 4 views
5

Можно создать дубликат:
How to Flatten a Multidimensional Array?Упростить вложенный массив в массив одного уровня

Скажем, у меня есть массив как это:

array (
    1 => 
    array (
    2 => 
    array (
     16 => 
     array (
     18 => 
     array (
     ), 
    ), 
     17 => 
     array (
    ), 
    ), 
), 
    14 => 
    array (
    15 => 
    array (
    ), 
), 
) 

Как бы я пойти о преобразовании его в массив вроде этого?

array(1,2,16,18,17,14,15); 
+0

использовать var_export или предоставить нам исходный массив. –

+0

@ Elzo Valugi: Я обновил свой вопрос. –

+1

@ Gordon: Это не совсем то же самое. В случае OPs значения фактически являются * ключами *. –

ответ

2

Извините за closevote. Не обращал должного внимания на то, что вам нужны ключи. Решение ниже:

$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 
) 
0

Если мы рассмотрим вложенный массив как структуру дерева, вы можете применить глубины первого обхода, чтобы преобразовать его в список. То есть, в единый массив, который вы желаете.

2

как насчет рекурсии

$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);

P.S.:Code может прослушиваться, но у вас есть идея :)

0

Я искал все подобные вопросы и, кажется, нет никакого способа, без рекурсии, которая будет держать ключи нетронутыми заказ.

Так что я просто пошел с классической рекурсии:

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; 
} 
1
function flattenArray($array) { 
$arrayValues = array(); 
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $val) { 
    $arrayValues[] = $val; 
} 
return $arrayValues; 
} // function flattenArrayIndexed() 
+0

Это просто скрывает рекурсию. Но рекурсия все еще существует. Плюс мне нужны ключи массива, а не значения. –

Смежные вопросы