这个排序在网上直接搜索的结果有这样一个:

array_multisort(array_column($array,'sort'),SORT_ASC,$array);

这个是错误的。 切忌不要以讹传讹了。

分析排查 最终结果

分析排查

实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort

array1
要排序的 array。

array1_sort_order
之前 array 参数要排列的顺序。 SORT_ASC 按照上升顺序排序, SORT_DESC 按照下降顺序排序。

此参数可以和 array1_sort_flags 互换,也可以完全删除,默认是 SORT_ASC 。

array1_sort_flags
为 array 参数设定选项:

排序类型标志:

SORT_REGULAR - 将项目按照通常方法比较(不修改类型)
SORT_NUMERIC - 按照数字大小比较
SORT_STRING - 按照字符串比较
SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。
SORT_NATURAL - 以字符串的"自然排序",类似 natsort()
SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。
参数可以和 array1_sort_order 交换或者省略,默认情况下是 SORT_REGULAR。

...
可选的选项,可提供更多数组,跟随在 sort order 和 sort flag 之后。 提供的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。

第一个参数是需要排序的数组

array_multisort( $array );

排序默认是 升序、按常规数字方式, 如果不需要则可以省略

array_multisort( $array ); // SORT_ASC, SORT_REGULAR
array_multisort( $array, SORT_DESC, SORT_NATURAL );

最后一个参数 排序参考, 这里的 参考也就是说 排序会按照最后这个数组的key来进行排序。

array_multisort( $array, $howToSort );
array_multisort( $array, SORT_DESC, SORT_NATURAL, $howToSort );

最后来一段demo

<?php
<?php

$menu = [
    [
        "id"=>1,
        "sort"=>100
    ],
    [
        "id"=>2,
        "sort"=>50
    ],
    [
        "id"=>3,
        "sort"=>60
    ]
];


$tmp = array_column($menu,'sort');
asort($tmp);

array_multisort($menu, $tmp );

print_r( $menu );
Array
(
    [0] => Array
        (
            [id] => 1
            [sort] => 100
        )

    [1] => Array
        (
            [id] => 2
            [sort] => 50
        )

    [2] => Array
        (
            [id] => 3
            [sort] => 60
        )

)

可以发现,用这样的方式无法实现我们目标。 因为我们进行key排序之后,tmp数组的key 又变成了 0,1,2....n 这样也就意味着作为参考数组,失去了参考价值。

如果非要用这个 array_multisort() 就需要处理 这个参考数组。相当麻烦: 这里贴一段PHP官网网友的实现: https://www.php.net/manual/zh/function.array-multisort.php#100534

function array_orderby()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}
?>

The sorted array is now in the return value of the function instead of being passed by reference.

<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);

最终结果

实际上完全没必要,我们使用usort就可以轻松解决问题。

<?php

function compareBySort( array $a, array $b ): int{
    return $a['sort'] <= $b['sort'] ? -1 : 1;
}

$menu = [
    [
        "id":1,
        "sort"=>100
    ],
    [
        "id"=>2,
        "sort"=>50
    ],
    [
        "id"=>3,
        "sort"=>60
    ]
];

usort($menu, "compareBySort" );

print_r( $menu );
Array
(
    [0] => Array
        (
            [id] => 2
            [sort] => 50
        )

    [1] => Array
        (
            [id] => 3
            [sort] => 60
        )

    [2] => Array
        (
            [id] => 1
            [sort] => 100
        )

)

大功告成!

文章地址:




标签: php, sort, usort, array_multisort

添加新评论