paiza Bランクレベルアップメニュー「文字と整数の組のソート2 PHP編」final問題 解答例

1、2週間ぐらい悩みました。
結論から言うと、これに行きついたかどうかに尽きます。

foreach (配列変数 as &変数){
  実行する処理1;
  実行する処理2;
}

//変数の前に「&」を付けることで要素の値に対する参照を設定することができます。よって変数に対して新しい値を代入することで、要素の値を変更することが可能になります。

引用元:foreach文で配列要素の値を変更する

https://www.javadrive.jp/php/for/index10.html
あぶらぼうず

どうやらforeach内の変数$keyや$valueなどは、
for文のなかの$i, $jなどと同じで、
「その中でしか使えない変数」の模様。

よってキーがだぶっていたら値を足せ、ということをしても
その値が実際の配列に反映されてなかったんですね。

この「&」一文字を足して解決しました。

<?php
    // 自分の得意な言語で
    // Let's チャレンジ!!

    $num = trim(fgets(STDIN));
    $hoge = array();
    
    for ($i = 0; $i < $num; $i++) {
        $s = explode(" ",trim(fgets(STDIN)));
        //echo("s0 s1 ".$s[0].",".$s[1]."\n");
        
        $flag = false;//英文字のだぶりがあるかどうか
        
        foreach($hoge as $key => &$value){//&をつけると反映される
            if($s[0]==$key){
                $value = $value + $s[1];
                $flag = true;
            }
        }
        
        if($flag==false){
            $hoge+=array($s[0]=>$s[1]);
        }
    }
    
    arsort($hoge);
    //print_r($hoge);

    //出力
    foreach($hoge as $key=>&$value){//なぜだかここにも&が必要になった
        echo($key." ".$value."\n");
    }

?>

分からないのはこれです。なぜここにも&が必要なのだろう。

//出力
    foreach($hoge as $key=>&$value){//なぜだかここにも&が必要になった
        echo($key." ".$value."\n");
    }

これを入れないとケース3ぐらいが通らなかったです。

この記事の問題はこちら
paiza Bランクレベルアップメニュー(PHP編)

https://paiza.jp/works/mondai/prob60/problem_index?language_uid=php
kue

そしてこれにてBランクレベルアップメニューすべてが通りました。
つまりこの問題が一番大変でした。

3+