#b-navbar { height:0px; display:none; visibility:hidden; }

ページ

2011年11月6日日曜日

多次元配列のソートまとめ

■PHP1
<?php
$list = array(
array("no"=>3, "cat"=>5, "body"=>"リンゴ"),
array("no"=>2, "cat"=>4, "body"=>"みかん"),
array("no"=>4, "cat"=>5, "body"=>"ナシ"),
array("no"=>6, "cat"=>3, "body"=>"バナナ"),
array("no"=>1, "cat"=>4, "body"=>"オレンジ")
);
usort($list, create_function('$a, $b', 'return $a["cat"]-$b["cat"];'));

print_r("<pre>");
print_r($list);
print_r("</pre>");
?>


■PHP2
$hoge = array(
array('id'=>'3','date'=>'2010.10','name'=>'イカ娘'),
array('id'=>'1','date'=>'2010.10','name'=>'それでも町は廻ってる'),
array('id'=>'2','date'=>'2010.11','name'=>'百花繚乱サムライガール'));
これを一番目の要素で並び替えたいときは。

//いったんソートするキーを配列で取り出して、
foreach($hoge as $key=>$value){
$id[$key] = $value['id'];
}

array_multisort($id ,SORT_ASC,$hoge);

//これで並び替え完了。DESCもできます。



■Javascript1

<script language="JavaScript" type="text/javascript"><!--
var list = [
{"no":3, "cat":5, "body":"リンゴ"},
{"no":2, "cat":4, "body":"みかん"},
{"no":4, "cat":5, "body":"ナシ"},
{"no":6, "cat":3, "body":"バナナ"},
{"no":1, "cat":4, "body":"オレンジ"}
];
list.sort(function(a, b) {return a.cat-b.cat});

var text="";
for(var i=0; i<list.length; i++) {
text += "\n no:" + list[i].no + " cat:" + list[i].cat + " body:" + list[i].body;
}
alert(text);
//--></script>

 多次元配列listをcatの上り順だけでソートしていますが、noを含めた複数条件でソートする場合、list.sortの部分を以下のように書き直します。
list.sort(function(a, b) {return a.cat-b.cat || a.no-b.no});


単に「||」で追加したソート条件を区切るだけ。条件が増えれば、その分「||」で継ぎ足していけばOK。実にシンプルで美しいコードです。



参考:
http://ma-bank.com/item/752
http://d.hatena.ne.jp/raharu0425/20101020/1287539676
thanks!

0 件のコメント:

コメントを投稿