如何按PHP中内部数组的一个字段对多维数组进行排序?

假设我有一个模仿数据库表的数组。每个数组元素表示一行,每行内是另一个包含字段名称和值的数组。

Array
(
    [0] => Array
        (
            [name] => 'Sony TV'
            [price] => 600.00
        )

    [1] => Array
        (
            [name] => 'LG TV'
            [price] => 350.00
        )

    [2] => Array
        (
            [name] => 'Samsung TV'
            [price] => 425.00
        )  
}

我想做的是按价格对行(外部数组元素)进行排序。以下是我想要实现的目标的示例:

Array
(
    [0] => Array
        (
            [name] => 'LG TV'
            [price] => 350.00
        )

    [1] => Array
        (
            [name] => 'Samsung TV'
            [price] => 425.00
        )

    [2] => Array
        (
            [name] => 'Sony TV'
            [price] => 600.00
        )        
}

如您所见,我不需要保留外部数组的键。


答案 1

它只是一个衬里

array_multisort( array_column($yourArray, "price"), SORT_ASC, $yourArray );

您也可以在这里找到它:http://php.net/manual/en/function.array-multisort.php

在该手册页上搜索“array_column”。

2020年12月1日更新:

正如@Tyler V.在他的评论中提到的,这种语法可能会导致较新的PHP 7版本中的错误,“只有变量可以通过引用传递”。为了避免这些,您需要将一个衬垫更改为两个衬垫:

$col = array_column( $yourArray, "price" );
array_multisort( $col, SORT_ASC, $yourArray );

2022年8月12日更新:PHP 8 不需要两个班轮!

您可以使用此代码段来检查您的 PHP 版本。如果没有抛出错误,一个衬里对你来说是可以的!https://onlinephp.io/c/9700bf6e-fe65-4868-ae58-300d092662d7


答案 2

您需要使用 usort,这是一个通过用户定义的函数对数组进行排序的函数。像这样:

function cmp($a, $b)
{
    if ($a["price"] == $b["price"]) {
        return 0;
    }
    return ($a["price"] < $b["price"]) ? -1 : 1;
}

usort($yourArray,"cmp")