アルゴリズム+データ構造
    勉強会(8)
   2013-03-25 アロハ)竹腰 彰成
第8回 usort()を使ったソート
usort()の前に:sort()
• http://www.php.net/manual/ja/function.sort.php
  • 配列をソートする
• 通常、ソートが必要な場合は用意されている関数を使う
  • ソートアルゴリズムを自前で作ると不具合混入の恐れがある
  • クイックソートをチューニングした関数なので速い
  • 楽できる
usort()とは
• http://php.net/manual/ja/function.usort.php
   • usort — ユーザー定義の比較関数を使用して、配列を値でソートする
• 比較関数だけを作り、実際の入れ替えは組み込み関数に任せてし
  まう
usort()の使い方
• PHPマニュアルより                        • 出力例
• <?php
                                    • 0: 1
 function cmp($a, $b)
 {                                    1: 2
   if ($a == $b) {
      return 0;                       2: 3
   }                                  3: 5
   return ($a < $b) ? -1 : 1;
 }                                    4: 6
 $a = array(3, 2, 5, 6, 1);
 usort($a, ’cmp’);
 foreach ($a as $key => $value) {
   echo "$key: $value¥n";
 }
create_function()を使う場合(匿名関数)
• 使い捨ての関数になりがちなので、使い捨ててしまう方法
• <?php
$a = array(3, 2, 5, 6, 1);
usort($a, create_function(‘$a, $b’,
  ‘if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1;’
  )
);
foreach ($a as $key => $value) {
  echo "$key: $value¥n";
}
PHP5.3:クロージャを使う場合(無名関数)
• JavaScriptのように書ける(ただしPHPの人には読みにくいかもしれない)
• <?php
 $arr = array(3, 2, 5, 6, 1);
 usort($arr, function($a, $b) {
  if ($a == $b) {
     return 0;
  }
  return ($a < $b) ? -1 : 1;
 });
 foreach ($arr as $key => $value) {
   echo "$key: $value¥n";
 }
usort()を使うシーン
• 組み込みでのソート関数では対応できない場合




• 数値・文字列には対応しているがarrayやobjectには対応していない
実習:usort()の利用
• usort()を使って次のものを実装してください。
 • array(
     array(1,4,7),
     array(3,6,9),
     array(8,5,2)
   )
 • 配列の中の合計値の小さい順に並び替える
• 勉強会の残り時間を使って書いてください。時間のある限り質問を
  受け付けます
• できあがったら提出してください
• 時間に間に合わない場合は宿題にします
今回の単語まとめ
• usort()
• create_function()
• クロージャ

アルゴリズム+データ構造勉強会(8)