Array

(
[0] => Array
(
[a] => 1番目
[b] => 1231231-B-00000001
[c] => 2006/11/21
[i] => 2006-11-16 14:03:01
)
[1] => Array
(
[a] => 4番目
[b] => 22222222-B-000005
[c] => 2006/12/08
[i] => 2006-11-17 12:02:07
)
[2] => Array
(
[a] => 2番目
[b] => 1231232-R-000001
[c] => 2006/11/29
[i] => 2006-11-17 13:51:38
)
[3] => Array
(
[a] => 3番目
[b] => 22222224-B-000005
[c] => 2006/12/08
[i] => 2006-11-17 11:02:07
)
)
この配列をまず、bの項目で昇順に並べて次に
iの項目で昇順に並べたいのですが
PHP4でソート処理をするにはどうしたらいいのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2006/11/22 13:37:44
  • 終了:2006/11/22 16:23:43

回答(2件)

id:kno No.1

kno回答回数1ベストアンサー獲得回数02006/11/22 14:01:24

ポイント35pt

array_multisort()関数でこういうことができそうです。

http://jp.php.net/manual/ja/function.array-multisort.php

// 列方向の配列を得る

foreach ($data as $key => $row) {

$volume[$key] = $row['volume'];

$edition[$key] = $row['edition'];

}

// データを volume の降順、edition の昇順にソートする。

// $data を最後のパラメータとして渡し、同じキーでソートする。

array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

id:hopefully

出来ましたwww

ありがとうございますwww

2006/11/22 16:21:54
id:backupper No.2

backupper回答回数95ベストアンサー獲得回数102006/11/22 15:36:00

ポイント35pt

これは、2次配列の項目であるBでソートし、B項目だけでは比較できない場合はi項目でもソートするという意味ですよね?

以下の様にしてみました。

用意されたデータでは、b項目だけで並び順が決定されてしまうので、3番目のb項目を4番目と同じ値にして試しています。結果bでは判定できず、i項目の日時で3番目が4番目より上にランクされます。

<?php

$array = array(
  "0" => array("a" => "1番目", "b" => "1231231-B-00000001", "c" => "2006/11/21", "i" => "2006-11-16 14:03:01"),
  "1" => array("a" => "4番目", "b" => "22222222-B-000005",  "c" => "2006/12/08", "i" => "2006-11-17 12:02:07"),
  "2" => array("a" => "2番目", "b" => "1231232-R-000001",   "c" => "2006/11/29", "i" => "2006-11-17 13:51:38"),
  "3" => array("a" => "3番目", "b" => "22222222-B-000005",  "c" => "2006/12/08", "i" => "2006-11-17 11:02:07")
  );
usort($array, "mycmp");
print "<table border=¥"1¥">¥n";
foreach ($array as $hash) {
  print "<tr>¥n";
  foreach ($hash as $key => $value) {
    print "  <td>{$key} =&gt; {$value}</td>¥n";
  }
  print "</tr>¥n";
}
print "</table>¥n";


function mycmp($a, $b) {
  $compare = $a["b"] - $b["b"];
  if ($compare == 0) {
    $compare = $a["i"] - $b["i"];
  }
  return $compare;
}
?>
id:hopefully

そうですwww

ありがとうございますwww

2006/11/22 16:23:16
  • id:backupper
    追加ですが、文字列として比較する場合はstrcmpで比較します。今回のケースはbはなにかのコードっぽいので文字列比較の方が良かった用に思います。
    ついでに、昇順と降順を入れ替えるには、比較時の$aと$bを入れ替えます。
    以下は、文字列として比較して、昇順を降順に変更した場合の比較用関数です。
    function mycmp($a, $b) {
    $compare = strcmp($b["b"], $a["b"]);
    if ($compare == 0) {
    $compare = strcmp($b["i"], $a["i"]);
    }
    return $compare;
    }
    既にご存知の事かとも思いましたが、老婆心ながらコメントさせて頂きました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません