Php 尝试从多维(递归)数组中提取所有值
我试图创建一个包含现有多维数组所有值的单个数组。这就是我到目前为止所做的:Php 尝试从多维(递归)数组中提取所有值,php,arrays,Php,Arrays,我试图创建一个包含现有多维数组所有值的单个数组。这就是我到目前为止所做的: function MaxArray($arr) { foreach ($arr as $value) { if (is_array($value)) { MaxArray($value); } else { $array[] = $value; } } print_r($array); } $a
function MaxArray($arr) {
foreach ($arr as $value) {
if (is_array($value)) {
MaxArray($value);
} else {
$array[] = $value;
}
}
print_r($array);
}
$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404, array(1,2))));
MaxArray($arr);
当我执行这个代码时,我从print\r函数得到这个响应
Array ( [0] => 141 [1] => 151 [2] => 161 ) Array ( [0] => 1 [1] => 2 ) Array ( [0] => 303 [1] => 404 ) Array ( [0] => 101 [1] => 202 ) Array ( [0] => 2 [1] => 3 )
正如您所看到的,这不是我想要的,我不知道如何将多维数组中的所有值组合到一个数组中。有人能在这里给我指出正确的方向吗?您尝试做的通常被称为“数组展平”,因此ArrayFlatten可能是比MaxArray更好的函数名称,因为后者听起来好像会返回数组中的最高值,这非常好。ArrayFlatten可以这样写:
function ArrayFlatten($array, $return) {
for ($x = 0; $x < count($array); $x++) {
if(is_array($array[$x])) {
$return = ArrayFlatten($array[$x], $return);
}
else {
if($array[$x]) {
$return[] = $array[$x];
}
}
}
return $return;
}
$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));
$res = ArrayFlatten($myarray,array());
要获得此信息:
Array
(
[0] => a
[1] => b
[2] => x
[3] => y
[4] => z
[5] => p
)
From.您尝试执行的操作通常被称为“数组展平”,因此ArrayFlatten可能是比MaxArray更好的函数名称,因为后者听起来像是返回数组中的最高值,这非常好。ArrayFlatten可以这样写:
function ArrayFlatten($array, $return) {
for ($x = 0; $x < count($array); $x++) {
if(is_array($array[$x])) {
$return = ArrayFlatten($array[$x], $return);
}
else {
if($array[$x]) {
$return[] = $array[$x];
}
}
}
return $return;
}
$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));
$res = ArrayFlatten($myarray,array());
要获得此信息:
Array
(
[0] => a
[1] => b
[2] => x
[3] => y
[4] => z
[5] => p
)
从。$array将在每次执行MaxArray时重新创建和打印。您需要在所有递归执行中构建它。我认为最好的方法是让MaxArray函数返回该数组,而不是将其打印出来。。。当我输入这个时,多米尼克·罗杰刚刚为你做了 在每次执行MaxArray时都会重新创建并打印$array。您需要在所有递归执行中构建它。我认为最好的方法是让MaxArray函数返回该数组,而不是将其打印出来。。。当我输入这个时,多米尼克·罗杰刚刚为你做了 函数应该引用结果数组,该数组永远不会更改
function flatten($cur, & $result) { ... flatten($x, $result); ... }
下面是一个示例:函数应该引用结果数组,该数组永远不会更改
function flatten($cur, & $result) { ... flatten($x, $result); ... }
这里有一个例子:这里有另一个变体,说明了foreach的使用和保留一些字符串键
function array_flatten($array) {
$rslt = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$rslt = array_merge($rslt, array_flatten($val));
} elseif (is_int($key)) {
$rslt[] = $val;
} else {
// for string keys, earlier values are overwritten with later ones
$rslt[$key] = $val;
}
}
return $rslt;
}
对于不同的冲突行为,更改$rslt[$key]=$val;行。这里是另一个变体,说明了foreach的使用和保留一些字符串键
function array_flatten($array) {
$rslt = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$rslt = array_merge($rslt, array_flatten($val));
} elseif (is_int($key)) {
$rslt[] = $val;
} else {
// for string keys, earlier values are overwritten with later ones
$rslt[$key] = $val;
}
}
return $rslt;
}
对于不同的冲突行为,更改$rslt[$key]=$val;行。如果只想输出递归数组的最大值,请使用
function MaxArray($arr) {
$max = 0;
foreach($arr as $a)
{
if(is_array($a)) {
$max = MaxArray($a);
} else if($a > $max){
$max = $a;
}
}
return $max;
}
如果只想输出递归数组的最大值,请使用
function MaxArray($arr) {
$max = 0;
foreach($arr as $a)
{
if(is_array($a)) {
$max = MaxArray($a);
} else if($a > $max){
$max = $a;
}
}
return $max;
}
感谢您的快速回复,您的功能运行得非常好,只是它显示了一系列类似于以下的通知错误。。。注意:第16行未定义的偏移量:3 in/Users/Devin/Sites/mywebapp/query.php知道是什么导致了这些错误吗?$x@Dominic:make$return为了效率起见通过引用传递。您还可以为$return设置数组的默认值,以简化使用。感谢您的快速回复,您的函数工作得非常好,只是它显示了一系列类似以下的注意错误。。。注意:第16行未定义的偏移量:3 in/Users/Devin/Sites/mywebapp/query.php知道是什么导致了这些错误吗?$x@Dominic:make$return为了效率起见通过引用传递。您还可以为$return设置默认值array,以简化使用。