array_multisort()は多次元配列をソートするわけだけども、ソートするキーの配列を作らないといけないのでめんどくさい。 (横配列→縦配列) そういうわけで下のようなものを作った。
/**
* $array = array(
* array('a' => 0, 'b' => 1, 'c' => 2, 'd' => 3, 'e' => 4),
* array('a' => 4, 'b' => 3, 'c' => 2, 'd' => 1, 'e' => 0),
* array('a' => 2, 'b' => 3, 'c' => 4, 'd' => 0, 'e' => 1),
* array('a' => 0, 'b' => 4, 'c' => 3, 'd' => 2, 'e' => 1)
* );
* multi_sort($array, 'a', SORT_ASC, 'b', SORT_DESC);
*
* @param &$array 多次元配列
* @param ... key1 [SORT_ASC|SORT_DESC] key2 [SORT_ASC|SORT_DESC] ...
*/
function multi_sort(&$array) {
$args = func_get_args();
$argc = func_num_args();
$data = array();
foreach ($array as $key => $val) {
for ($i = 1; $i < $argc; $i+=2) {
if (!array_key_exists($args[$i], $data)) $data[$args[$i]] = array();
$data[$args[$i]][$key] = $val[$args[$i]];
}
}
$arg_str = "";
for ($i = 1; $i < $argc; $i+=2) {
$arg_str .= '$data[' . "{$args[$i]}" . ']' . ",";
$arg_str .= "{$args[$i+1]},";
}
}
$array_str = '&$array';
if (!eval("return array_multisort($arg_str $array_str);")) {
return false;
}
return true;
}
しかし、これでハマッタわけで。 array_multisort()の最後の引数に配列のリファレンスやグローバル変数を渡すとソートされないらしい(PHP4)。でもリファレンスを渡すといいらしい。 なもんで、最初 $array_str = ‘$array’; としていたので上手くソートされずにムキィ!となったとさ。キーワード:php,array_multisort,ソート,多次元配列ソート,バグ
ピンバック: masomi79の日記