0

array_multisort() で配列をソートしようとしていますが、最初の列しかソートしていないようです。4列でソートしたいです。これが私の機能です。

function array_sort_by_column(&$arr, $col, $col2, $col3, $col4, $dir = SORT_DESC) {
    foreach ($arr as $key => $row) {
        $sort_col[$key] = $row[$col];
        $sort_col2[$key] = $row[$col2];
        $sort_col3[$key] = $row[$col3];
        $sort_col4[$key] = $row[$col4];
    }
    array_multisort($sort_col, $dir, $sort_col2, $dir, $sort_col3, $dir, $sort_col4, $dir, $arr);
}

ここでの入力は、$arr としての 2 次元配列であり、次に $col1、$col2、$col3、および $col4 としてソートしたい列名です。

編集:申し訳ありませんが、2次元配列を意味していました

サンプル:

$arr = array(
    0 => array(
        'group_id' => '1',
        'points' => '5',
        'rank' => '10',
        'diff' => '1'
    ),
    1 => array(
        'group_id' => '1',
        'points' => '1',
        'rank' => '2',
        'diff' => '4'
    ),
    2 => array(
        'group_id' => '2',
        'points' => '1',
        'rank' => '1',
        'diff' => '2'
    ),
    3 => array(
        'group_id' => '2',
        'points' => '9',
        'rank' => '0',
        'diff' => '-11'
    ),
);

array_sort_by_column($arr, 'group_id', 'points', 'rank', 'diff');
4

1 に答える 1

0

Barmarが示すように、 usortを使用する必要があります。すべての並べ替え機能を1つの関数またはクラスメソッドに配置する必要があります。

public function sort($a, $b) 
{
    $key = $this->sort_key;
    $asc = $this->sort_asc;

    if (gettype($a[$key]) == 'integer') {
        if ($a[$key] == $b[$key]) return 0;
        if ($asc == 'asc') {
            return ($a[$key] < $b[$key]) ? -1 : 1;
        } elseif ($asc == 'desc') {
            return ($a[$key] > $b[$key]) ? -1 : 1;
        }
    } elseif (gettype($a[$key]) == 'string') {

        $valA = preg_replace("/[^A-Za-z0-9]/", "", strtolower($a[$key]));
        $valB = preg_replace("/[^A-Za-z0-9]/", "", strtolower($b[$key]));

        if ($asc == 'asc') {
            return strcmp($valA, $valB);
        } elseif ($asc == 'desc') {
            return strcmp($valB, $valA);
        }
    }   
}

そして、次のように呼び出します。

$this->sort_key = 'group_id';
$this->sort_asc = 'asc';
usort($array, array($this, 'sort'));

クラスにいることを確認する必要があります。上記の方法では、整数だけでなく文字列である値を並べ替えることもできます(つまり、将来的に再利用できます)。

于 2013-02-23T14:48:44.853 に答える