質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2584閲覧

PHP配列を昇順でソートしたい

shiro96

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/05 09:13

###前提・実現したいこと
var_dump = $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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

がると申します。

一端、直接的には、コードを以下のように書き換えると「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:30

gallu

総合スコア506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiro96

2017/05/05 09:42

ありがとうございます。このようなミスは何回も繰り返しているので、解説していただき、とても身になりました。
shiroyuki

2017/05/05 09:51 編集

破壊的という指摘は間違っていないと思いますが、あたかも悪いことかのように表現するのはいかがなものかと思います。 ソートの実行にわざわざ配列の複製を作成しメモリや処理コストを余分に使用する意味がわかりません。 なぜphpやその他多くの言語の標準のsortが参照になっているのかわかりますか? 「参照渡しは可能な限り避けた方が良い」というのは常々同意いたしますが。
gallu

2017/05/05 14:46

特に破壊的関数について、良いとも悪いとも書いていないかとは思うのですが。 ちなみに他言語のお話をしますと、Rubyは「破壊的と非破壊と2種類」ですし、Pythonは「破壊的なsortもあるが、基本的には非破壊を使う事が多い」と認識をしています。 Perlは破壊的…かと思ったのですが、こちらのコメントを記述するうえで調べてみると、どうも非破壊であるように見受けられます。 このあたりは、メモリ効率以外にも色々な、思想や背景等があると思いますので、是非は人それぞれ状況次第、かとは思いますが。 それゆえに「個人的には「PHPでの参照渡しは可能な限り避けた方が良い」と思っているので、あまりお勧めはいたしません。」と書かせていただきました。
shiroyuki

2017/05/05 16:52 編集

今回は引数が配列であったため、このコードでも問題はないかと思いますが引数に渡される値がobjectであった場合は「&の有無に関わらず問答無用で参照」になってしまいます。 これを知らないままMVCモデルでの開発で意図せぬ参照渡しを行ってしまっていて潜在バグの原因になることもあります。 PHPにおいては、引数が参照ではないから安心、参照を使わせなければOKというのは思わぬ落とし穴になりますので、時間が許すのであればその使い方を正しく学んでもらったほうが有意義であると考えます。 >sortHoge()のローカルスコープな$hogeが「globalの$hogeの内容をcopyした、別の変数として」定義される (これは理解しやすくするためのイメージであると思うのですが) PHPを使用する側は気にする必要はないのですが、PHP内部では引数が非参照形式の場合でも値の編集が発生するまではメモリ上では同一アドレスを参照しています。 引数の変数に対する編集が発生した時点でメモリを消費してコピーが作成されますので、メソッドに入った瞬間はまだcopyは作成されていませんので厳密には異なります。
gallu

2017/05/06 02:13

とりあえず2点だけ。 > 引数が参照ではないから安心、参照を使わせなければOK とはどこにも書いてありません。 私が書いたのは「個人的には「PHPでの参照渡しは可能な限り避けた方が良い」と思っている」です。 お話をゆがめずに言及いただければ幸いです。 > PHPを使用する側は気にする必要はないのですが copy on writeのお話については「ある程度PHPをやっている人間であれば意識をしておいたほうがよいもの」であり、同時に「初心者に説明するには蛇足にすぎるもの」です。 今回については「蛇足だと思われるので省略」しています。 さて。 質問主ではない方とのこれ以上の議論は、サイトの趣旨的にもよいかどうか不明ですし、個人的に「他人の庭で騒ぐ」のはあまり好みではありませんので。 以降の返信は控えさせていただきます。あしからずご了承ください。
guest

0

asortの使用方法は正しいですか?
http://php.net/manual/ja/function.asort.php

php

1 $hoge = [6,4,2,5,3,1]; 2 asort($hoge); 3 var_dump( $hoge );

また、別の関数へ渡してその中でデータの変更を行う場合には、引数を参照で受け取るようにしてください

php

1 $hoge = [6,4,2,5,3,1]; 2 3 public function sortHoge(&$hoge){ 4 return asort($hoge); 5 } 6 7 sortHoge($hoge); 8 var_dump( $hoge );

投稿2017/05/05 09:23

編集2017/05/05 09:29
shiroyuki

総合スコア169

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiro96

2017/05/05 09:51

ありがとうございます。 参照渡しも試していたのですが、どうやら書き方が間違っていたみたいです。 この方法でも、実行することが出来ました!
guest

0

sort() でソートできると思いますが。。。

php

1<?php 2 $hoge = [6, 6, 10, 4, 12]; 3 print_r($hoge); 4 5 sort($hoge); 6 print_r($hoge);
$php sort-array.php Array ( [0] => 6 [1] => 6 [2] => 10 [3] => 4 [4] => 12 ) Array ( [0] => 4 [1] => 6 [2] => 6 [3] => 10 [4] => 12 )

投稿2017/05/05 09:22

miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問