Hyd*_*erA 6 php arrays recursion multidimensional-array
$temp = array();
function show_keys($ar)
{
foreach ($ar as $k => $v )
{
$temp[] = $k;
if (is_array($ar[$k]))
{
show_keys ($ar[$k]);
}
}
return $temp;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用该功能,但它仍然只返回第一个键.
使用SPL,循环键很容易(如果你愿意,可以将它们存储在另一个数组中):
<?php
$arr = array_fill(0,8,range(0,3));
var_dump($arr);
foreach( new RecursiveIteratorIterator(
new RecursiveArrayIterator($arr),
RecursiveIteratorIterator::SELF_FIRST)
as $key => $value){
var_dump($key);
}
?>
Run Code Online (Sandbox Code Playgroud)
主要问题是您丢弃了递归调用的结果show_keys()。您不对返回值执行任何操作。
评论是内联的。
function show_keys($ar)
{
// Create new temp array inside function so each recursive call gets
// a separate instance.
$temp = array();
foreach ($ar as $k => $v )
{
$temp[] = $k;
// Use $v instead of $ar[$k].
if (is_array($v))
{
// Combine results of recursive show_keys with $temp.
$temp = array_merge($temp, show_keys($v));
}
}
return $temp;
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到了很多过于复杂的解决方案......
function array_keys_r($array) {
$keys = array_keys($array);
foreach ($array as $i)
if (is_array($i))
$keys = array_merge($keys, array_keys_r($i));
return $keys;
}
Run Code Online (Sandbox Code Playgroud)
你的数组$temp是全局的。要使您可以在您需要的功能中访问:
global $temp;
Run Code Online (Sandbox Code Playgroud)
在函数的开始处。
目前,该函数的每次调用都会创建一个具有该名称的新数组$temp,当您最终从该函数返回到其调用者时,$temp将返回您在第一次调用中创建的数组,其中仅包含第一级的键。
请注意,使用全局变量并不是好的编程。您需要将数组作为参数传递给递归调用,并通过添加每次迭代中找到的键来修改传递的数组,就像亚历山大和约翰所做的那样。