Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

PHP max()を使った問題についての質問です。

Q&A

解決したいこと

max()で配列の最大値を取り出したい

発生している問題・エラー

PHP Fatal error:  Uncaught TypeError: max(): Argument #1 ($value) must be of type array, null given in /workspace/Main.php:10

配列を渡してくれと怒られているのでしょうか。
問題は、次の通りです。

3 3
226 409 419
491 524 82
417 954 751

以上の入力値から、最大の値を出力せよという問題です。
回答は954となります。

該当するソースコード

<?php
[$N,$K] = explode(" ",trim(fgets(STDIN)));
for ($i = 0; $i < $N; $i++) {
     $array[] = explode(" ",trim(fgets(STDIN)));
}

for ($i = 0; $i < $N; $i++) {
    $max = max($array[$i]);
    if ($max < max($array[$i + 1])) {
        $max = max($array[$i + 1]);
    }
}
echo $max;
?>

自分で試したこと

if ($max < max($array[$i + 1])) {

エラーでは9行目のこの部分で配列を渡してくれと言われていると思うのですが、自分では配列を渡していると思うのですが何が間違っているのでしょうか。

0

2Answer

おそらく配列に存在しない添字を渡しているのではないかと思います。
var_dump()などでデータを表示して確認してみましょう。
$array$iの値は想定通りになっていますか?

<?php
[$N,$K] = explode(" ",trim(fgets(STDIN)));
var_dump($N); // ?
for ($i = 0; $i < $N; $i++) {
     $array[] = explode(" ",trim(fgets(STDIN)));
}
var_dump($array); // ?
for ($i = 0; $i < $N; $i++) {
    var_dump($i); // ?
    var_dump(isset($array[$i + 1])); // ?
}
1Like

Comments

  1. @voyce_sakamoto

    Questioner

    回答ありがとうございます。
    var_dump(isset($array[$i + 1])); // ?
    で、最後のisset()を行った時にfalseと出ていたので、そこが空であるせいでmax()に存在しない値を渡してしまっている、という解釈で大丈夫でしょうか?
  2. はい、その解釈で合っています。
  3. @voyce_sakamoto

    Questioner

    わかりやすい回答ありがとうございました!

for ($i = 0; $i < $N; $i++) のように配列を操作すると $array[$i + 1] のように範囲外にはみだすので、 foreach を使った方が安全です。

<?php
 
[$N,$K] = explode(" ",trim(fgets(STDIN)));
for ($i = 0; $i < $N; $i++) {
     $array[] = explode(" ",trim(fgets(STDIN)));
}
 
$max = PHP_INT_MIN;
foreach ($array as $a) {
    $max = max($max, max($a));
}
 
echo $max;

どうしても for を使いたいなら、こうです。 (が、foreachを使った方がいいと思います)

$max = max(array_shift($array));
for ($i = 0; $i < count($array); $i++) {
    $max = max($max, max($array[$i]));
}

なおmaxは配列をとれますので、以下のように書けます。

<?php
 
[$N,$K] = explode(" ",trim(fgets(STDIN)));
for ($i = 0; $i < $N; $i++) {
     $array[] = explode(" ",trim(fgets(STDIN)));
}
 
echo max(array_merge(...$array));

array_merge()array_merge([1, 2, 3], [4, 5, 6])[1, 2, 3, 4, 5, 6]のような一つの配列に結合する関数ですが、array_merge(...$array)のように書くことでarray_merge($array[0], $array[1], $array[2])のように変形され(実際には0, 1, 2のような固定値ではなく全て)、それをmax()に直接渡すことで max([226, 409, 419, 491, 524, 82, 417, 954, 751]) になり、この配列の中での最大値である 954 が返されます。

1Like

Your answer might help someone💌