• ベストアンサー

多次元配列のソートについて

始めまして。 多次元配列のソート方法について分からないことがある為教えていただけないでしょうか。 $a[0] = array('2007/3/1','あ100','その他'); $a[1] = array('2007/3/1','あ200','その他'); $a[2] = array('2007/3/2','あ200','その他'); $a[3] = array('2007/3/2','あ300','その他'); $a[4] = array('2007/3/3','あ50','その他'); 上記のような配列があった場合、usort関数でやると、日付かその後ろの数値の値を元にソートできますが、両者の関係を持たせたソートは可能でしょうか。 結果としては $b[0] = "2007/3/3 あ50"; $b[1] = "2007/3/2 あ200"; $b[2] = "2007/3/2 あ300"; $b[3] = "2007/3/1 あ100"; $b[4] = "2007/3/1 あ200"; というようにしたいのです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • i2719
  • ベストアンサー率35% (11/31)
回答No.2

一例として function cmp($a, $b) { $c=strtotime($b[0])-strtotime($a[0]); if ($c==0) $c=strlen($a[1])-strlen($b[1]); if ($c==0) return strcmp($a[1], $b[1]); return $c; }

wish46
質問者

お礼

ありがとうございました。 できました。 これを応用してもう1つできました。 一応載せておきます。 function cmp($a,$b){ $a1 = strtotime($a[0]); $b1 = strtotime($b[0]); $a2 = $a[1]; $b2 = $b[1]; $c = strcmp($a2,$b2); if($c == 0) $c = $b1 - $a1; if($c == 0) return strcmp($b1,$a1); return $c; } 最初の質問と反対に文字列をソートし、同じ文字列があったときは更に日付をソートする方法です。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

2点補足が必要です。 (1)両者の関係を持たせたソート の意味がわかりません。 日付けで逆順ソートし、同じ場合にはあxxxでソートするという意味ですか? (2)「あ50」は「あ050」ではないのですか? そうしないとあ50はあ100より大きい値になります。 (前から順番に適合するので)

wish46
質問者

補足

失礼しました。 (1)はその通りです。 日付でソートし、同じ日付の中にあるものを更にソートする方法です。 昇順でも降順でも構いません。 (2)の場合は「あ050」というのを基準にしたいと思っています。 しかしクライアントは「あ050」とではなく「あ50」と入力することもあります。このへんの変換は正規表現でなんとかなると思います。 先ほどの質問で言い忘れたのですが、 usort関数を使って(PHPマニュアルあるものをそのまま使用) 数値をソートしたのち日付でusortを使っても結局日付のみソートされ 数値のほうはバラバラでした。(「あ50」を「あ050」に置き換えても駄目でした)