24042


array_multisort関数で画面のチェックボックスがONになっている項目のみ配列データ（$data）をソートしたいのですが、シンプルにできる方法はありますか？

[code]

    $data = array(array('a' => '日本', 'b' => 'たなか', 'c' => '東京都', 'd' => 'A型', 'e' => '60kg', 'f' => '2016-01-03'),
         array('a' => '日本', 'b' => 'さとう', 'c' => '東京都', 'd' => 'O型', 'e' => '58kg', 'f' => '2016-01-03'),
         array('a' => '日本', 'b' => 'やまだ', 'c' => '千葉県', 'd' => 'O型', 'e' => '100kg', 'f' => '2016-01-03'));
    
    foreach($data as $key => $row) {
        $tmp_check_a[$key] = $row['a'];
        $tmp_check_b[$key] = $row['b'];
        $tmp_check_c[$key] = $row['c'];
        $tmp_check_d[$key] = $row['d'];
        $tmp_check_e[$key] = $row['e'];
        $tmp_check_f[$key] = $row['f'];
    }
    
    //例1：チェックボックスAとチェックボックスBがONの場合は
    array_multisort($tmp_check_a, $tmp_check_b, $data);
    
    //例2：チェックボックスC、D、E、FがONの場合は
    array_multisort($tmp_check_c, $tmp_check_d, $tmp_check_e, $tmp_check_f, $data);
    
[/code]

よろしくお願い致します。


CC BY-SA 3.0
2016-04-15T04:10:10.717
24033
2016-04-15T09:23:16.237
2016-04-15T07:12:21.727
8000
15167
question
php
多次元配列のソートarray_multisort関数を使うときに引数の数を動的にしたい


[`call_user_func_array()`](http://php.net/manual/ja/function.call-user-func-
array.php) を使うと任意の関数に渡す引数を配列で指定できます。

[code]

    $checked_a=1;$checked_b=1;$checked_c=0;
    
    $params = array();
    
    if($checked_a) $params[] = &$tmp_check_a;
    if($checked_b) $params[] = &$tmp_check_b;
    if($checked_c) $params[] = &$tmp_check_c;
    // ...
    
    $params[] = &$data;
    
    call_user_func_array('array_multisort', $params);
    
    var_export($data);
    
[/code]

`array_multisort()`
は引数に渡した配列自身を変更するために、[参照渡し](http://php.net/manual/ja/functions.arguments.php#functions.arguments.by-
reference)で引数を受け取ります。これを `call_user_func_array()` で行うため、上記のコードでは `$params`
に各変数を代入する際に `&$data` などとして参照を代入するようにしています。

`call_user_func_array()` と `array_multisort()` を組み合わせて二次元配列のソートを行う関数の例が
`array_multisort()` のコメント欄に多数投稿されています。こちらも参考になるかと思います。

<http://php.net/manual/ja/function.array-multisort.php#usernotes>

* * *

なお、PHP5.5以上であれば [`array_column()`](http://php.net/manual/ja/function.array-
column.php) で特定の列だけを配列として取り出せます。これを使うと foreach がいらなくなりますし、 `$tmp_check_*`
を省略することもできますね。お好みでどうぞ。

[code]

    if($checked_a) $params[] = array_column($data, 'a');
    if($checked_b) $params[] = array_column($data, 'b');
    if($checked_c) $params[] = array_column($data, 'c');
    // ...
    
    $params[] = &$data;
    
[/code]


CC BY-SA 3.0
2016-04-15T09:23:16.237
24042
2016-04-15T09:23:16.237
8000
24033
answer