[英]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.