2010-11-19 47 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