2010-11-19 23 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或給我們原始數組。 – 2010-11-19 07:46:00

+0

@Elzo Valugi:我已經更新了我的問題。 – 2010-11-19 07:50:08

+1

@戈登:它不完全一樣。在OP中,值實際上是*鍵*。 – 2010-11-19 09:48:04

回答

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

這只是隱藏遞歸。但遞歸仍然存在。另外我需要數組鍵,而不是值。 – 2010-11-19 09:23:38

相關問題