假设我有一个这样的数组:
array (
1 =>
array (
2 =>
array (
16 =>
array (
18 =>
array (
),
),
17 =>
array (
),
),
),
14 =>
array (
15 =>
array (
),
),
)
我如何将其转换为像这样的数组呢?
array(1,2,16,18,17,14,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可以被窃听,但你有一个想法:)
答案 1 :(得分: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
)
答案 2 :(得分:1)
function flattenArray($array) {
$arrayValues = array();
foreach (new RecursiveIteratorIterator( new RecursiveArrayIterator($array)) as $val) {
$arrayValues[] = $val;
}
return $arrayValues;
} // function flattenArrayIndexed()
答案 3 :(得分:0)
如果我们将嵌套数组视为树结构,您可以应用深度优先遍历将其转换为列表。也就是说,你需要一个阵列。
答案 4 :(得分: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;
}