[asort,sort,uasort,usort]配列のソート

公開日| 2015年4月19日   更新日| 2015年4月19日   コメントはありません。

今回は、配列(array)のソート機能です。
phpでは、配列をarrayで表し、配列をソートするための関数が標準で提供されています。

今回は、配列のソートに仕方について簡単に解説したいと思います。

ソートの基本

配列の値でソートする基本操作を書いてみましょう。

配列の値を、単純にソートする場合、以下のようにasortを使って行うことができます。

$list = array(
	3 => 'value=3' ,
	1 => 'value=1' ,
	2 => 'value=2' ,
);
var_dump($list);
asort($list);
var_dump($list);

これを実行すると、

C:\ > php array_sort1.php
array(3) {
  [3]=>
  string(7) "value=3"
  [1]=>
  string(7) "value=1"
  [2]=>
  string(7) "value=2"
}
array(3) {
  [1]=>
  string(7) "value=1"
  [2]=>
  string(7) "value=2"
  [3]=>
  string(7) "value=3"
}
C:\ >

のようになります。

きれに値でソートできましたね。

ここで、注意すべきは、キーも値も一緒にソート時に順番が入れ替わることです。

あたりまえって思うでしょ。でも、phpでは、もう一つソート関数があります。 それが、sortなのですが、これは、キーは、無視します。

asortsortへ入れ替えて実行してみましょう。

C:\ > php array_sort2.php
array(3) {
  [3]=>
  string(7) "value=3"
  [1]=>
  string(7) "value=1"
  [2]=>
  string(7) "value=2"
}
array(3) {
  [0]=>
  string(7) "value=1"
  [1]=>
  string(7) "value=2"
  [2]=>
  string(7) "value=3"
}
C:\ >

のようになります。

値は、正しくソートされてます。しかし、キーは、再割り当てされます。

asortsortの違いが、はっきり出ましたね。
sortは、キーが文字列であれ、数値であれ、数値で再割り当てされるので、注意が必要です。 しかし、単純に値だけをソートしたい場合は、sortの方を使う方が良いでしょう。なんせ処理の速さが違います。

ソートの応用

上記のように数値や文字列でのソートができればよいですが、例えば、クラスオブジェクトをソートしたいとき・・ってどうでしょう。

独自の判断基準(ロジック)を持つ関数を利用するには、先のasortsortと同じように、それぞれuasortusortの関数を使います。

では、早速、やってみましょう。
以下の例では、’2’という文字列を含んだ値が、必ず先頭になるようにしています。

function cmp($a,$b)
{
	if(strpos($a,'2')!==false){
		return -1;
	} else if(strpos($b,'2')!==false){
		return 1;
	} else {
		return strcmp($a,$b);
	}
}
 
$list = array(
	3 => 'value=3' ,
	1 => 'value=1' ,
	2 => 'value=2' ,
);
var_dump($list);
uasort($list,'cmp');
var_dump($list);

これを実行すると、

C:\ > php array_sort1.php
array(3) {
  [3]=>
  string(7) "value=3"
  [1]=>
  string(7) "value=1"
  [2]=>
  string(7) "value=2"
}
array(3) {
  [2]=>
  string(7) "value=2"
  [1]=>
  string(7) "value=1"
  [3]=>
  string(7) "value=3"
}
C:\ >

のようになります。

確かに’2’の文字列を含む’value=2’がトップになりましたね。

いかがだったでしょうか。

配列の扱いやすさは、さすがはphpという感じです。非常に簡単にソートもできますね。

クラス内で定義したメソッドをソート関数として指定したい場合は、以下のようにすると良いです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class testArray 
{
	public $list = array(
		3 => 'value=3' ,
		1 => 'value=1' ,
		2 => 'value=2' ,
	);
	public function cmp($a,$b)
	{
		if(strpos($a,'2')!==false){
			return -1;
		} else if(strpos($b,'2')!==false){
			return 1;
		} else {
			return strcmp($a,$b);
		}
	}
	public function sortexec()
	{
		uasort($this->list,array($this,'cmp'));
	}
	public function dump()
	{
		var_dump($this->list);
	}
}
$obj = new testArray();
$obj->dump();
$obj->sortexec();
$obj->dump();
20行目のように、配列で指定すればOKです。
最初がオブジェクト、2番目がオブジェクト内メソッド名 となります。


コメント

口コミ・評判を投稿 :

ブラウザの JavaScriptが無効となっている場合、コメントの投稿はできません。
コメントを投稿するには、JavaScriptを有効にしてください

お名前 *

メールアドレス *
(口コミ・評判欄には、表示されませんが入力が必要です。)

サイトアドレス



  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ