使用指定的排序规则对多列上的关联数组进行排序

问题描述 投票:7回答:5

我希望能够在多列上对关联数组进行排序。为了使其更加复杂,我希望能够为每个键/列设置特定的排序选项。我有一组与数据库查询的结果集相似的数据,但实际上并非来自一个数据集,因此我需要使用PHP而不是SQL对其进行排序。

[
    ['first_name' => 'Homer', 'last_name' => 'Simpson', 'city' => 'Springfield', 'state' => 'Unknown', 'zip' => '66735'],
    ['first_name' => 'Patty', 'last_name' => 'Bouvier', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85250'],
    ['first_name' => 'Moe', 'last_name' => 'Szyslak', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85255'],
    ['first_name' => 'Nick', 'last_name' => 'Riviera', 'city' => 'Scottsdale', 'state' => 'Arizona', 'zip' => '85255'],
];

我希望能够对它进行类似于数据库查询的排序。哦,有时需要按数字指定列/键。

我想到的是类似的东西:

$sortOptions = array(
    array( 'city', SORT_ASC, SORT_STRING),
    array( 'zip', SORT_DESC, SORT_NUMERIC),
    array( 2, SORT_ASC, SORT_STRING) // 2='last_name'
);
$sorter = new MultiSort($data, $sortOptions);
$sortedData = $sorter->getSortedArray();
print_r($jmsSorted);

我想最后得到的是:

Array
(
    [0] => Array
        (
            [first_name] => Nick
            [last_name] => Riviera
            [city] => Scottsdale
            [state] => Arizona
            [zip] => 85255
        )

    [1] => Array
        (
            [first_name] => Moe
            [last_name] => Szyslak
            [city] => Scottsdale
            [state] => Arizona
            [zip] => 85255
        )

    [2] => Array
        (
            [first_name] => Patty
            [last_name] => Bouvier
            [city] => Scottsdale
            [state] => Arizona
            [zip] => 85250
        )

    [3] => Array
        (
            [first_name] => Homer
            [last_name] => Simpson
            [city] => Springfield
            [state] => Unknown
            [zip] => 66735
        )

)

UPDATE:我认为理想情况下,一种解决方案将导致动态创建

array_multisort( $city, SORT_ASC, SORT_STRING, $zip, SORT_DESC, SORT_NUMERIC, $last_name, SORT_ASC, SORT_STRING, $inputArray);

问题是我不想在其中“硬编码”那些键名。我尝试根据最终使用array_multisort()array_multisort()文档中的示例#3对数据库结果进行排序创建一个解决方案,但是我似乎找不到找到将动态构建的参数列表用于array_multisort()的方法。

我的尝试是将这些参数“链接”到一个数组中,然后

array_multisort()

导致出现

警告:array_multisort()的参数2有望作为参考,值在...中给出>]

我希望能够在多列上对关联数组进行排序。为了使其更加复杂,我希望能够为每个键/列设置特定的排序选项。我有一组数据...

php arrays sorting multidimensional-array
5个回答
4
投票

在PHP 5.3中,使用call_user_func_array( 'array_multisort', $functionArgs); 调用array_multisort()时,数组中的每个参数都必须是引用。


3
投票

这应该适合您所描述的情况。


1
投票

您可能想尝试使用array_multisort()。您所要做的就是创建一个告诉分类器如何对其进行分类的函数。该文档具有有关如何执行此操作的更多信息。


1
投票

这是我最终决定能够对多维数组进行排序的内容。上面的两个答案都不错,但我也在寻找一些灵活的方法。


0
投票

[我已经看到了许多在http://www.php.net/manual/en/function.usort.php#104398内使用/** * Sort the resultSet. * * Usage: $sortOptions = array( * 'section', // Defaults to SORT_ASC * 'row' => SORT_DESC, * 'retail_price' => SORT_ASC); * $results->sortResults($sortOptions); * * @param array $sortOptions An array of sorting instructions */ public function sortResults(array $sortOptions) { usort($this->_results, $this->_usortByMultipleKeys($sortOptions)); } /** * Used by sortResults() * * @link http://www.php.net/manual/en/function.usort.php#103722 */ protected function _usortByMultipleKeys($key, $direction=SORT_ASC) { $sortFlags = array(SORT_ASC, SORT_DESC); if (!in_array($direction, $sortFlags)) { throw new InvalidArgumentException('Sort flag only accepts SORT_ASC or SORT_DESC'); } return function($a, $b) use ($key, $direction, $sortFlags) { if (!is_array($key)) { //just one key and sort direction if (!isset($a->$key) || !isset($b->$key)) { throw new Exception('Attempting to sort on non-existent keys'); } if ($a->$key == $b->$key) { return 0; } return ($direction==SORT_ASC xor $a->$key < $b->$key) ? 1 : -1; } else { //using multiple keys for sort and sub-sort foreach ($key as $subKey => $subAsc) { //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which if (!in_array($subAsc, $sortFlags)) { $subKey = $subAsc; $subAsc = $direction; } //just like above, except 'continue' in place of return 0 if (!isset($a->$subKey) || !isset($b->$subKey)) { throw new Exception('Attempting to sort on non-existent keys'); } if ($a->$subKey == $b->$subKey) { continue; } return ($subAsc==SORT_ASC xor $a->$subKey < $b->$subKey) ? 1 : -1; } return 0; } }; } 的Stack Overflow解决方案,但是从PHP5.6起,splat运算符可以取消嵌套排序功能并允许对其进行独占调用。

© www.soinside.com 2019 - 2024. All rights reserved.