2007.07.12 10:07
php :: ソート用の配列を用いた多次元配列のソート
番号順や文字コード順でなく、配列の配列に含まれるvalueに着目した順番にソートするやり方を考えてみました。
こんな配列があったとして↓
$array = array(
array(
"番号" => 1,
"めし" => 'とんかつ',
"お好み" => '毎日食いたい',
),
array(
"番号" => 5,
"めし" => 'ぎゅうどん',
"お好み" => 'たまに食いたい',
),
array(
"番号" => 12,
"めし" => 'ラーメン',
"お好み" => '毎日食いたい',
),
array(
"番号" => 4,
"めし" => 'シュガーレスガム',
"お好み" => '要らない',
),
array(
"番号" => 8,
"めし" => 'バブリシャスガム',
"お好み"=> '毎日食いたい',
),
array(
"番号" => 9,
"めし" => 'てんぷら',
"お好み" => '毎日食いたい',
),
array(
"番号" => 99,
"めし" => 'トマト',
"お好み"=> 'たまに食いたい',
),
);
番号順にソートする方法はいろんなところでよく紹介されてるんだけど(ココとか←ありがとうです)、「毎日食いたい→たまに食いたい→要らない」の順にソートするのはどうすりゃいいのかなぁという話。まずはソート用の配列をつくる↓
$sort_order_array = array( '毎日食いたい', 'たまに食いたい', '要らない', );
usortの引数にするためのユーザー定義関数をこんなかんじで↓
function cmp_dinner($a, $b){
global $sort_order_array;
$a_key = array_search($a['お好み'],
$sort_order_array);
$b_key = array_search($b['お好み'],
$sort_order_array);
if($a_key > $b_key){
return 1;
}else if($a_key < $b_key){
return -1;
}else{
return 0;
}
}
さいごはコレでイッパツできあがり↓
usort($array, "cmp_dinner");
やりたいことができました→出力結果
ていうやり方をじぶんで考えたんだけど、もっと良い方法がありましたら教えてください。array_searchという関数は『配列の中に指定したvalueがあればそのkeyを返す』という機能なので、それを使って「『毎日食いたい』は1番だよ(ていうか添え字はゼロですが)」とかいうのを教えてやるのですね。ちなみに、cmp_dinnerの中のelseのぶぶんにさらにifナンチャラと追加してやるとソート条件を追加できます。
多次元配列でアレコレやってると、なんだかパズルみたいで頭がくちゃくちゃになります私。データベースつくるときなんかものすごい悩んじゃいます。つくづくこういう才能がないなぁと思う瞬間です。生まれてこのかた、オセロゲーム勝ったことないですし(花札はちょと得意ですけどネ)。パパッとできちゃうひとは大尊敬ですよ。こんなのはプログラマの方にとってはルーチンなんでしょうけど、私くらいのレベルの者にはなんだか新鮮ですわ。おお、やったー、みたいな。
ウェブデザイナーの日記 [コメント (0) :: トラックバック (0) ]
このエントリーのトラックバックURL:
http://blog.3ot.net/ping/940
