1

次のように初期化された配列の場合:

   $arr = array(array(141,151,161),2,3,array(101,102,array(303,404,606,555,789,array(1000,22,9999,array(9057,100000),522))));

結果は次のようになります: 100000

この問題を解決する関数を作成しましたが、必要なバイト数とコードのメモリが少なくて済みます。

私の機能は次のとおりです。

function MaxArray($arr){
$length = count($arr);
global $maxValue;
for($i=0;$i<$length;$i++){
        if(is_int($arr[$i])){

                if($maxValue < $arr[$i]){
                    $maxValue = $arr[$i];
                }

        }
        elseif(is_array($arr[$i])){     
                MaxArray($arr[$i]);
            }
        }
    return $maxValue;   
}
4

2 に答える 2

5

PHPマニュアルから引用しましたが、私が作成しました。

/**
 * @param array $array
 *
 * @return int|null Returns the largest value of the array. Returns NULL if no 
 *     integers are found.
 */
function array_max_recursive(array $array) {
    $max = NULL;
    $stack = array($array);

    do {
        $current = array_pop($stack );
        foreach ($current as $value) {
            if (is_array($value)) {
                $stack[] = $value;
            } elseif (filter_var($value, FILTER_VALIDATE_INT) !== FALSE) {
                // max(NULL, 0) returns NULL, so cast it
                $max = (int) max($max, $value);
            }
        }

    } while (!empty($stack));

    return $max;
}

  • この関数は実際には再帰的ではありませんが、サブ配列で機能するという要件を満たしています。私は時々ランタイムスタックなしで物事をするのを楽しんでいます。
  • int型の何かを返しますが、intの文字列表現を返すことはありません。例外は、整数を含まない配列を指定する場合です。その後、NULLを返します。
  • 非配列、非int値を無視します。
于 2012-08-22T04:36:01.437 に答える
4

ネストされた配列をウォークスルーするための便利な関数はarray_walk_recursive(). これは、再帰を自分で処理することを心配する必要がなく、目前のタスク (この場合は最大値を見つける) に取り掛かることができることを意味します。

function MaxArray($arr) {
    $max = FALSE;
    array_walk_recursive($arr, function ($current) use (&$max) {
        if ($max === FALSE) {
            $max = $current;
        } else {
            $max = max($current, $max);
        }
    });
    return $max;
}
于 2012-08-22T17:34:53.153 に答える