Php 我需要一个数组\u keys\u recursive()
我尝试使用该函数,但它仍然只返回第一个键。您的数组Php 我需要一个数组\u keys\u recursive(),php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我尝试使用该函数,但它仍然只返回第一个键。您的数组$temp是全局的。要在您需要的功能中访问,请执行以下操作: $temp = array(); function show_keys($ar) { foreach ($ar as $k => $v ) { $temp[] = $k; if (is_array($ar[$k])) { show_keys ($ar[$k]); } }
$temp
是全局的。要在您需要的功能中访问,请执行以下操作:
$temp = array();
function show_keys($ar)
{
foreach ($ar as $k => $v )
{
$temp[] = $k;
if (is_array($ar[$k]))
{
show_keys ($ar[$k]);
}
}
return $temp;
}
在函数的开头
当前,该函数的每次调用都会创建一个名为$temp
的新数组,当您最终从该函数返回到其调用方时,您在第一次调用中创建的$temp
将被返回,该数组只有您的第一级键
请注意,使用全局变量不是很好的编程。您需要将数组作为参数传递给递归调用,并像Alexander和John所做的那样,通过添加在每次迭代中找到的键来修改传递的数组。主要问题是您正在丢弃递归
show_keys()
调用的结果。您不会对返回值执行任何操作
注释是内联的
global $temp;
这可能会奏效吗 您必须要么引入$temp作为全局变量,要么从每个递归中获取返回值。我们希望避免全局变量,所以我们将每个递归调用的值与以前收集的值合并
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;
}
因为这个函数是无限的。但我的任务是帮助你)
使用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);
}
?>
这个问题不明确,因为您没有指定输入和预期输出 考虑以下示例阵列:
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;
}
到目前为止,所有其他解决方案都提供了一个平坦的一维键数组列表
$array = [
'first' => [
'second' => [
'third' => 'three',
],
'deuxième' => 'two',
],
];
但是,我需要一个array\u keys\u recursive
函数来保留层次结构
$keys = [
'first',
'second',
'third',
'deuxième',
];
对于其他正在寻找类似需求的人,以下是我的解决方案:
$keys = [
'first' => [
'second' => [
'third',
],
'deuxième',
],
];
作为其他解决方案的补充,有可能返回扁平阵列,但仍保留有关树的信息。我们可以将嵌套键与父键连接起来。当您区分相同的子键但不同的父键时,它可能有助于与其他数组进行差异化
function array_keys_recursive(array $array) : array
{
foreach ($array as $key => $value) {
if (is_array($value)) {
$index[$key] = array_keys_recursive($value);
} else {
$index []= $key;
}
}
return $index ?? [];
}
例如:
function array_keys_flatten_recursive($array, $parentKey = "") {
$keys = array_keys($array);
foreach ($array as $parentKey => $i)
if (is_array($i)) {
$nestedKeys = array_keys_flatten_recursive($i, $parentKey);
foreach($nestedKeys as $index => $key) {
$nestedKeys[$index] = $parentKey . "." . $key;
}
$keys = array_merge($keys, $nestedKeys);
}
return $keys;
}
没有区别,似乎它一开始就接受了$temp。你可能是对的,这离解决方案又近了一步。这种递归在很多情况下是无限的。关于风格的一个注意事项:不要调用变量
temp
或tmp
,特别是在全局命名空间中,这会导致混乱。名字应该是描述性的;称它为键
,因为它包含的就是这些。
function array_keys_recursive(array $array) : array
{
foreach ($array as $key => $value) {
if (is_array($value)) {
$index[$key] = array_keys_recursive($value);
} else {
$index []= $key;
}
}
return $index ?? [];
}
function array_keys_flatten_recursive($array, $parentKey = "") {
$keys = array_keys($array);
foreach ($array as $parentKey => $i)
if (is_array($i)) {
$nestedKeys = array_keys_flatten_recursive($i, $parentKey);
foreach($nestedKeys as $index => $key) {
$nestedKeys[$index] = $parentKey . "." . $key;
}
$keys = array_merge($keys, $nestedKeys);
}
return $keys;
}
$array = array(
"one" => array(
"one" => "lorem"
),
"two" => array(
"one" => "lorem"
)
);
// result : array("one", "two", "one.one", "two.one")