delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

php :: ソート用の配列を用いた多次元配列のソート

2007/7/12 (Thu) at 10:17 am

エントリのアイコン

後から追記。この記事を書いてからずいぶん経ってから、array_multisort関数のほうがずっとべんりだと知りました↓

array_multisort

てわけで、まったく有用な内容ではありませんが、いちおうこういう時代もあったという意味で残しておこうかなと。

番号順や文字コード順でなく、配列の配列に含まれる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ナンチャラと追加してやるとソート条件を追加できます。

多次元配列でアレコレやってると、なんだかパズルみたいで頭がくちゃくちゃになります私。データベースつくるときなんかものすごい悩んじゃいます。つくづくこういう才能がないなぁと思う瞬間です。生まれてこのかた、オセロゲーム勝ったことないですし(花札はちょと得意ですけどネ)。パパッとできちゃうひとは大尊敬ですよ。こんなのはプログラマの方にとってはルーチンなんでしょうけど、私くらいのレベルの者にはなんだか新鮮ですわ。おお、やったー、みたいな。

delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

コメント・プリーズ!

お名前 (your name)
(required)
url
(optional) ※公開されます。
メールアドレス (email)
(optional) ※公開されません。管理者にだけわかります。
コメント (comment)
(required)

※クッキーに保存すると次回から入力を省略できるので便利ですが、お使いのコンピュータに情報が残りますので、公共のパソコンなどからアクセスするような場合はチェックをはずしたほうがよいでしょう。

※コメント中のhtmlタグは実体参照に変換されます。たとえば、『<』は『&lt;』というかんじになりますのでhtmlタグをそのまま書き込んでくださってオッケーです。

one-px-ffffff-tl one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

PROFILEcaption

藤居ヒロヤ。ウェブデザイナー/ウェブディレクター。ウェブデザインオフィス、3OT NET主宰。名古屋市中区。「優しいデザイン」「激しいデザイン」「正しいデザイン」「セクシーなデザイン」「泣けるデザイン」「もっともなデザイン」... 。あなただけのウェブデザインを丹精込めておつくり致します。見積り依頼等、お気軽にお問い合わせ下さい。

お問い合わせフォーム

RECENT ENTRIEScaption

RECENT COMMENTScaption

TOOLScaption

BOOKMARKScaption

RESOURCEScaption

ARCHIVEcaption