質問: $hoge; array(5) { [0]=> int(6) [1]=> int(6) [2]=> int(10) [3]=> int(4) [4]=> int(12) } このような配列を値の数字の昇順で表示したいです。 5つの値が入ったこのような配列はたくさんあるのですが、 結果として1,2,3,4,5や2,3,4,5,6といった5つ続いたものが値にあれば、何らかの処理を加えるプログラムを書く展開にしたいです。 (もしかしてsortしなくても判断できるのかも...とも思っています) ### 発生している問題・エラーメッセージ ``` エラーはありません。 ``` ### 該当のソースコード ``` public function sortHoge($hoge){ return asort($hoge); } sortHoge($hoge); //この状態でvar_dumpすると上のような出力結果になり、ソートされていません。 ``` ### 試したこと ksortやasort、ただのsortでもこのようになります。 ### 補足情報(言語/FW/ツール等のバージョンなど) PHP5
回答: がると申します。 一端、直接的には、コードを以下のように書き換えると「sortされた配列」が取得できると思います。 ``` public function sortHoge($hoge){ asort($hoge); return $hoge; } $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の変数が「どのように保持されていて」「どのように関数にわたっていくか」をきちんと理解しておくとよいです。 関数の引数このあたりが参考になります。 なお、破壊的関数にしたい場合は ``` public function sortHoge(&$hoge){ ``` という書き方にしてもよいのですが、個人的には「PHPでの参照渡しは可能な限り避けた方が良い」と思っているので、あまりお勧めはいたしません。 以上、何かの参考にでもなれば幸いです。