PHP:配列の最初のkeyを取り出す、配列の最初と最後の要素を取得。

  • array_key_first:配列の最初のkey を取得する

$keys = array_key_first($rainAll);

  • reset(), end() :配列の最初と最後の要素を取得。

reset($resultDays) . ' ' . end($resultDays);

getSumRain():ここが成長を感じた点

平均降水確率を作成する際、合計の降水確率が欲しい。それを別の関数(getSumRain)で求めることにした。

  • 考え:旅行の日数分、forループを回す

ただし、$i = 0 で回すと、毎回、$i = 0 に初期化されてループが回るので、意図した合計値を求められない。

getAvgRainsAndDays関数で、$i は、0, 1, 2, ... と足されていくので、それをgetSumRain関数でも連動するように、$count を作った。

  • $i < $tripDays + $count

上記のように設定した理由は、毎回、旅行日数分ループを回したいが、$i の初期値が getSumRain関数が呼び出されるたびに、$count 分増えるので、同じく、上限値を$count分、毎回増やして対応するっていう意図。

  function getSumRain(array $rainAll, int $tripDays, int $dayoffs, int $count): int
    {   
        $sum = 0;
        for($i = $count; $i < $tripDays + $count; $i++) {
            $sum += $rainAll[$i];
        }
        return $sum;
    }
    
    // $tripDays分の平均降水確率とその各日付 の配列
    function getAvgRainsAndDays(array $rainAll, int $tripDays, int $dayoffs, array $daysAndRains): array
    {
        $rainAvg = [];
        $avgOfDays = [];
        // 日付の配列を生成
        $daysKey = array_keys($daysAndRains);
        $count = 0;
        for ($i = 0; $i < $dayoffs; $i++) {
            if (($i + $tripDays) <= $dayoffs) {
                $sum = getSumRain($rainAll, $tripDays, $dayoffs, $count);
                $count++;

^^^^^^^^^^^^

fscanf(STDIN, "%d %d", $dayoffs, $tripDays);
    
    // 休日が、1日の場合
    if ($dayoffs === 1) {
        [$a, $b] = explode(" ", trim(fgets(STDIN)));
        echo $a . ' ' . $a;
        die();
    }

    $daysAndRains = [];
    for($i = 0; $i < $dayoffs; $i++) {
        [$day, $rain] = explode(" ", rim(fgets(STDIN)););
        $daysAndRains[$day] = $rain;
    }
    
    // $rainAllは、降水確率だけを格納した配列。
    $rainAll = [];
    foreach ($daysAndRains as $day => $rain) {
        $rainAll[] = (int) $rain;
    }
    
    // 旅行日数が、1日の場合
    if ($tripDays === 1) {
        asort($rainAll);
        // 降水確率の最小値のkeyをとりだし、それに該当する日付を取得する
        $keys = array_key_first($rainAll);
        $result = reset(array_slice($daysAndRains, $keys, 1));
        echo $result . ' ' . $result;
        die();
    }
    
    function getSumRain(array $rainAll, int $tripDays, int $dayoffs, int $count): int
    {   
        $sum = 0;
        for($i = $count; $i < $tripDays + $count; $i++) {
            $sum += $rainAll[$i];
        }
        return $sum;
    }
    
    // $tripDays分の平均降水確率とその各日付 の配列
    function getAvgRainsAndDays(array $rainAll, int $tripDays, int $dayoffs, array $daysAndRains): array
    {
        $rainAvg = [];
        $avgOfDays = [];
        // 日付の配列を生成
        $daysKey = array_keys($daysAndRains);
        $count = 0;
        for ($i = 0; $i < $dayoffs; $i++) {
            if (($i + $tripDays) <= $dayoffs) {
                $sum = getSumRain($rainAll, $tripDays, $dayoffs, $count);
                $count++;
                $avg = $sum / $tripDays;
                $rainAvg[] = $avg;
                // 各平均降水確率の日付を取得し、配列に格納する。
                $avgOfDays[] = array_slice($daysKey, $i, $tripDays);
            } else {
                return array($rainAvg, $avgOfDays);
            }
        }
    }
    $avgRainsAndDays = getAvgRainsAndDays($rainAll, $tripDays, $dayoffs, $daysAndRains);
    list($avgOfRains, $daysOfAvg) = $avgRainsAndDays;
    
    // 平均降水確率を昇順に並び替える。ただし、keyを維持したまま。
    asort($avgOfRains);
    
    // 最初のkeyを取得する
    $resultOfKey = array_key_first($avgOfRains);
    
    $resultDays = $daysOfAvg[$resultOfKey];
    
    echo reset($resultDays) . ' ' . end($resultDays);