[英]How to find the highest value in a multidimensional array?
我有以下数组:
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
我需要借助递归比较所有元素,以找到最大值。
我设法在最深的数组中找到最大值:
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
function arr_max_rec($ar3)
{
$max = $ar3[0];
foreach ($ar3 as $key => $value){
if ($max < $ar3[$key] and !is_array($value)){
$max = $ar3[$key];
}
elseif (is_array($ar3[$key])){
return arr_max_rec($ar3[$key]);
}
}return $max;
}
echo arr_max_rec($ar3);
但是我需要比较所有数字并找到最高的数字。 阵列的深度可以是任意的。
以下将起作用:
<?php
function arr_max_rec($ar3)
{ // \
// |
// / reduce the input array to a single value using
// | |
// | | / the given callback
// | | |
return array_reduce($ar3, function ($a, $b) {
// /
// / return the -------
// | /
// | / max value of $a, $b. But if $b
// | |
// | | / is an array, recurse first
// | | | |
return max($a, is_array($b) ? arr_max_rec($b) : $b);
}, PHP_INT_MIN);
}
演示: https : //3v4l.org/OUsmH
您可以尝试使用递归函数
<?php
$ar3=array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
function highestValue($ar3) {
foreach($ar3 as $key => $value) {
if (is_array($value)) {
$ar3[$key] = highestValue($value);
}
}
return max($ar3);
}
echo highestValue($ar3); //1155
PHP已经提供了本机递归函数来遍历多维数组的所有叶节点 ,该数组称为array_walk_recursive() 。 这提供了干净,简洁,直观的代码行。 当未来的开发人员查看您的代码时,他们将立即知道您的代码行将要实现的目标,而无需遵循多行代码和逻辑。 这将实现更好的可维护性,并表明您知道手头任务的直接工具。
在为$max
建立基值或默认值之后,您将编写一个处理条件逻辑的用户定义函数 (或“ closure”)。 关于闭包的怪事是它们有自己的“作用域”-这意味着其中的变量在函数外部不可用(至少,并非没有帮助)。 global
声明通常是不明智的(在许多情况下是个坏习惯,并且每次迭代都会读取该行),即使它们是出于很好的意图,所以use()
将用作导入变量和&
(这使得变量“ 可通过引用修改 ”)将用作将变量从函数作用域导出回全局作用域的方法。
代码:( 演示 )
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
$max = null; // declare a non-integer or minimum value here
array_walk_recursive($ar3, function($v)use(&$max){if($max === null || $v > $max) $max = $v;});
echo $max; // output: 1155
* array_walk_recursive()
返回true
或false
。 您不能在闭包内部使用return
将$max
移至全局范围。
*如果您最初将$max
声明为0
(因为您不希望出现负值),那么您就不需要条件表达式中的$max === null
检查。
*如果您要处理过深的多维数组(如数百个级别),则有可能发生堆栈崩溃。 我试图找到此主张的参考,但我找不到任何链接,尽管我确实在某处阅读过。
<?php
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
$first = intval($ar3[0]);
$min = '' ;
$max = '' ;
foreach($ar3 as $data) {
$array= intval($data);
if($array<= $min ) {
$min = $array;
}
if($array> $max ) {
$max = $array;
}
}
echo " max = $max \n " ;
?>
@Koiten以下是您的答案,请根据以下一项更正您的代码:
<?php
$ar3 = array(123, array(12, 665, array(77, 255, 98, 56), 8), 1155, 676);
function arr_max_rec($ar3){
$max = $ar3[0];
foreach($ar3 as $val){
if(!is_array($val) && $max < $val){
$max = $val;
}
else if(is_array($val)){
arr_max_rec($val);
}
}
return $max;
}
echo arr_max_rec($ar3);
?>
输出:1155
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.