php - call_user_func_array 和 array_multisort

标签 php mysql arrays sorting sortdirection

我遇到排序方向问题。我尝试按方向对多维数组进行排序。我无法使用array_multisort()直接,因为我不知道会有多少个参数。我用call_user_func_array('array_multisort', $params);它有效,但我无法设置排序方向( SORT_ASC,SORT_DESC )。如何设置 call_user_func_array('array_multisort', $params); 的排序方向? 这是我的代码,你可以尝试一下

function get_fields($data, $order_by) {
    $order_row = preg_split("/[\s,]+/", $order_by);
    for ($i=0;$i<count($order_row);$i++) {
        foreach ($data as $key => $row) {
          $tmp[$i][$key]  = $row[$order_row[$i]];      
        }
    }
    return $tmp;
}

function ordering($data, $order_by) {
    $tmp = get_fields($data, $order_by);
    $params = array();
    foreach($tmp as &$t){
        $params[] = &$t;
    }

    $params[1] = array("SORT_DESC","SORT_DESC","SORT_DESC","SORT_DESC"); // like that no warning but no sorting

    $params[] = &$data;
    call_user_func_array('array_multisort', $params);
    return array_pop($params);
}

$data = array (
    array('id' => 1,'name' => 'Barack','city' => 9),
    array('id' => 7,'name' => 'boris','city' => 2),
    array('id' => 3,'name' => 'coris','city' => 2),
    array('id' => 3,'name' => 'coris','city' => 2)
);

$order_by = "city desc, name";

echo "<br>ORDER BY $order_by<br>";
$ordered = ordering($data, $order_by);
echo "<pre>";
var_dump($ordered);
echo "</pre>";

我想做类似MySQL ORDER BY city DESC, name 的排序。这是我的目标。

最佳答案

为了能够对数组进行多次排序并获得像 ORDER BY city DESC, name ASC 这样的结果,您需要一个执行 stable sort 的函数.
据我所知 PHP 没有这样的函数,所以你必须使用像这样的比较器函数对它进行一次排序

$data = array (
    array('id' => 3,'name' => 'coris','city' => 2),
    array('id' => 1,'name' => 'Barack','city' => 9),
    array('id' => 7,'name' => 'boris','city' => 2),
    array('id' => 3,'name' => 'coris','city' => 2),
);

$order_by = array(
    'city' => array('dir' => SORT_DESC, 'type' => SORT_NUMERIC),
    'name' => array('dir' => SORT_ASC, 'type' => SORT_STRING),
);

function compare($row1,$row2) {
    /* this function should determine which row is greater based on all of the criteria
       and return a negative number when $row1 < $row2
                  a positive number when $row1 > $row2
                  0 when $row1 == $row2
    */

    global $order_by;

    foreach($order_by as $field => $sort) {
        if($sort['type'] != SORT_NUMERIC) {
            // strings are compared case insensitive and assumed to be in the mb_internal_encoding
            $cmp = strcmp(mb_strtolower($row1[$field]), mb_strtolower($row2[$field]));
        } else {
            $cmp = doubleval($row1[$field]) - doubleval($row2[$field]);
        }
        if($sort['dir'] != SORT_ASC) $cmp = -$cmp;
        if($cmp != 0) return $cmp;
    }
    return 0;
}


usort($data,'compare');

关于php - call_user_func_array 和 array_multisort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11721976/

相关文章:

javascript - jQuery 验证中的正则表达式 - 需要一个包含 5 位数字和 1 个字母的数字(字母不区分大小写)

c++ - 为什么相同数组代码的执行时间存在差异?

arrays - 在 node.js v11.0.0^ 中进行更改后,使用 array.sort(a, b) 的正确方法是什么?

php - PHP根据IF语句调用JS函数的问题

php - Yii2 RBAC 检查权限,无需 Controller 中的每个操作

php - 订购带有小数和非小数的 varchar 字段

php - PHP、Ajax 和 MySQL 中文本框中的自动完成

javascript - 可以绑定(bind) $scope 但无法访问数组,除非添加 Alert()

php - 如何在 PHP 中调用函数

mysql - 查询查找所有未出租的 DVD