将嵌套数组简化为单级数组[重复]

Posted

技术标签:

【中文标题】将嵌套数组简化为单级数组[重复]【英文标题】:Simplify a nested array into a single level array [duplicate] 【发布时间】:2011-05-12 12:00:21 【问题描述】:

可能重复: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);

【问题讨论】:

使用 var_export 或给我们原始数组。 @Elzo Valugi:我已经更新了我的问题。 @Gordon:不完全一样。在 OPs 的情况下,这些值实际上是 keys. 【参考方案1】:

很抱歉,我的投票很接近。没有适当注意你想要钥匙。解决方法如下:

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

【讨论】:

【参考方案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;

walkthouth($your_arr);

P.S.:代码可能有错误,但你有一个想法:)

【讨论】:

【参考方案3】:
function flattenArray($array) 
 $arrayValues = array();
 foreach (new RecursiveIteratorIterator( new RecursiveArrayIterator($array)) as $val) 
  $arrayValues[] = $val;
 
 return $arrayValues;
 // function flattenArrayIndexed()

【讨论】:

这只是隐藏了递归。但是递归仍然存在。另外我需要数组键,而不是值。【参考方案4】:

如果我们将嵌套数组视为树结构,则可以应用深度优先遍历将其转换为列表。也就是说,放入您想要的单个数组中。

【讨论】:

【参考方案5】:

我已经搜索了所有类似的问题,似乎没有可以保持键顺序不变的递归。

所以我只使用经典递归:

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;

【讨论】:

以上是关于将嵌套数组简化为单级数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将重复的 XML 元素序列化为数组?

如何将对象的json数组反序列化为字典[重复]

将C或C99中的结构数组初始化为所有相同的值[重复]

将平面对象数组转换为嵌套对象数组[重复]

将对象数组的数组简化为对象数组

使用 Jackson 和 Spring 将 JavaScript 数组反序列化为 Java LinkedHashSet 不会删除重复项