plasmasphere.net -プラズマスフィア ドットネット-
Diary
PHPでバブルソート
2006/10/05(Thu) 00:10
PHPのソート関数が無いかと探していたら、特に無かったのでバブルソート(Bubble Sort)をJava版からPHPに改変してみました。
rsort
とか使えば同じ動作するんで別にいらないんですが…。
ところがどっこい、二次元配列のイチ要素に対してソートを実行しようとすると、そうもいかなかったわけで。
例えば…
Array ( [0] => 12 [1] => 50 [2] => 20 [3] => 1574 [4] => 67 [5] => 54 [6] => 2 [7] => 35 [8] => 21 )
みたいな配列は普通にrsort
使えば問題ないんですが…
Array ( [0] => Array ( [name] => 名前1 [No] => 3 [value] => ****** ) [1] => Array ( [name] => 名前2 [No] => 1 [value] => ****** ) [2] => Array ( [name] => 名前3 [No] => 2 [value] => ****** ) [3] => Array ( [name] => 名前4 [No] => 5 [value] => ****** ) [4] => Array ( [name] => 名前5 [No] => 4 [value] => ****** ) )
みたいな配列をNo要素順にソートしようとするとうまくいかない。
いや、俺が間違ってるだけかもしれんが。
というわけでソース。
<?php $val = array(12,50,20,1574,67,54,2,35,21); echo "ソート前"; echo "<pre>"; print_r($val); echo "</pre>"; bsort($val); echo "ソート後"; echo "<pre>"; print_r($val); echo "</pre>\n<hr />\n"; $arr = array( "0" => array( "name" => "名前1", "No" => "3", "value" => "******"), "1" => array( "name" => "名前2", "No" => "1", "value" => "******"), "2" => array( "name" => "名前3", "No" => "2", "value" => "******"), "3" => array( "name" => "名前4", "No" => "5", "value" => "******"), "4" => array( "name" => "名前5", "No" => "4", "value" => "******"), ); echo "ソート前"; echo "<pre>"; print_r($arr); echo "</pre>"; bsort($arr, $flag = "No"); echo "ソート後"; echo "<pre>"; print_r($arr); echo "</pre>\n<hr />"; /* * バブルソート * $val = ソートする配列 * $flag = ソート対象の配列要素 * $order = ソートの昇順・降順 デフォルトは昇順 */ function bsort(&$val, $flag = "", $order = "ASC") { for($i=0;$i<count($val)-1;$i++){ for($j=count($val)-1;$j>i;$j--){ if($flag) { if($order=="DESC") { if($val[$j]["".$flag.""]>$val[$j-1]["".$flag.""]){ $t=$val[$j]; $val[$j]=$val[$j-1]; $val[$j-1]=$t; } } else { if($val[$j]["".$flag.""]<$val[$j-1]["".$flag.""]){ $t=$val[$j]; $val[$j]=$val[$j-1]; $val[$j-1]=$t; } } } else { if($order=="DESC") { if($val[$j]>$val[$j-1]){ $t=$val[$j]; $val[$j]=$val[$j-1]; $val[$j-1]=$t; } } else { if($val[$j]<$val[$j-1]){ $t=$val[$j]; $val[$j]=$val[$j-1]; $val[$j-1]=$t; } } } } } } ?>
単純なバブルソート。
要素が30を超えてくると、動作がぬるぬるしだす辺りはやっぱりバブルソートだなぁ…と。
クイックソートはまた明日にでも。