将嵌套数组简化为单级数组[重复]
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;
【讨论】:
以上是关于将嵌套数组简化为单级数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Jackson 和 Spring 将 JavaScript 数组反序列化为 Java LinkedHashSet 不会删除重复项