最近ハマッタarray_multisort()

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,ソート,多次元配列ソート,バグ

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: PHP, バグ パーマリンク

最近ハマッタarray_multisort() への1件のフィードバック

  1. ピンバック: masomi79の日記

コメントを残す

メールアドレスが公開されることはありません。