がると申します。
一端、直接的には、コードを以下のように書き換えると「sortされた配列」が取得できると思います。
PHP
1public function sortHoge($hoge){
2 asort($hoge);
3 return $hoge;
4}
5
6$hoge = sortHoge($hoge);
少し噛み砕きます。
asortは「破壊的関数(引数の値を直接変える関数)」なのですが。
それを包んでいるsortHogeは、「引数を直接変える関数」の型になっていないので。
大本の、うまくいかない時のPHPの動きのイメージとしては
・globalな領域に$hogeという変数がある(プログラムには記載がないのですが、あるんだろうと思います)
・関数 sortHoge() を、$hogeを引数として呼ぶ
・関数 sortHoge()で受け取った時点で「globalな$hogeとは別に」、関数sortHoge()のローカルスコープな$hogeが「globalの$hogeの内容をcopyした、別の変数として」定義される:以降、これを便宜的に「local::$hoge」と呼称します
・関数 asort()で、local::$hogeの内容をsortする
・関数 sortHoge()が終了
・$hogeは「なにもされていない」ので変更が発生しない
という流れになります。
これに対して、修正したコードは
・globalな領域に$hogeという変数がある(プログラムには記載がないのですが、あるんだろうと思います)
・関数 sortHoge() を、$hogeを引数として呼ぶ
・関数 sortHoge()で受け取った時点で「globalな$hogeとは別に」、関数sortHoge()のローカルスコープな$hogeが「globalの$hogeの内容をcopyした、別の変数として」定義される:以降、これを便宜的に「local::$hoge」と呼称します
・関数 asort()で、local::$hogeの内容をsortする
・local::$hogeの内容をreturnして、関数 sortHoge()
・$hogeは「returnされた local::$hogeの内容」になるので、結果、sortされる
という流れになります
このあたりは、PHPの変数が「どのように保持されていて」「どのように関数にわたっていくか」をきちんと理解しておくとよいです。
関数の引数このあたりが参考になります。
なお、破壊的関数にしたい場合は
PHP
1public function sortHoge(&$hoge){
という書き方にしてもよいのですが、個人的には「PHPでの参照渡しは可能な限り避けた方が良い」と思っているので、あまりお勧めはいたしません。
以上、何かの参考にでもなれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/05 09:42
2017/05/05 09:51 編集
2017/05/05 14:46
2017/05/05 16:52 編集
2017/05/06 02:13