【问题标题】:Why/how does this array_multisort() work?这个 array_multisort() 为什么/如何工作?
【发布时间】:2018-07-17 15:45:15
【问题描述】:

代码:

<?php
$data = array(
    'uid3' => array(
        'name' => 'Unique ID 3',
        'count' => 11
    ),
    'uid1' => array(
        'name' => 'Unique ID 1',
        'count' => 11
    ),
    'uid2' => array(
        'name' => 'Unique ID 2',
        'count' => 15
    ),
    'uid4' => array(
        'name' => 'Unique ID 4',
        'count' => 13
    )
);

$counts = array_map( function( $v ){
    return $v[ 'count' ];
}, $data );

$names = array_map( function( $v ){
    return $v[ 'name' ];
}, $data );

print_r( $counts );
print_r( $names );

array_multisort(
    $counts, SORT_DESC, SORT_NUMERIC,
    $names, SORT_ASC, SORT_STRING,
    $data
);

print_r( $data );

输出:

// $counts
Array
(
    [uid3] => 11
    [uid1] => 11
    [uid2] => 15
    [uid4] => 13
)

// $names
Array
(
    [uid3] => Unique ID 3
    [uid1] => Unique ID 1
    [uid2] => Unique ID 2
    [uid4] => Unique ID 4
)

// $data after sorting
Array
(
    [uid2] => Array
        (
            [name] => Unique ID 2
            [count] => 15
        )

    [uid4] => Array
        (
            [name] => Unique ID 4
            [count] => 13
        )

    [uid1] => Array
        (
            [name] => Unique ID 1
            [count] => 11
        )

    [uid3] => Array
        (
            [name] => Unique ID 3
            [count] => 11
        )

)

问题:

array_multisort()是如何知道将$counts的排序结果应用到多维数组$data中每一项的count子键的?

$namesname 子键类似。


奖励:

如果$names, SORT_ASC, SORT_STRING, 在函数调用中被注释掉,那么uid3 仍然会在uid1 之后结束。为什么?


我一直在阅读以下资源,但我无法确定这如何适用于我的示例:

http://php.net/manual/en/function.array-multisort.php

how php array_multisort work?

how to sort array like mysql

【问题讨论】:

    标签: php arrays sorting array-multisort


    【解决方案1】:

    我不打算将此作为答案发布,但我只需要一些额外的字符。

    我不能明确地说它是如何在技术层面上做到这一点的,但我认为专门解决“array_multisort() 如何知道将$counts 的排序结果应用于计数子键”,答案是“它没有”。更改子键,您会得到相同的结果。也许我没有按照您的意图阅读您的问题,但似乎您在问它如何知道查看 $data 的子键值然后进行排序。但事实并非如此。它查看$names 的排序方式(查看$counts 的排序方式)并将相同的排序应用于$dataprimary 键。这意味着它查看原始位置移动到新位置。您的第一个数组由一个子键的值组成,而第二个数组由另一个子键组成,这一事实无关紧要。以相同的顺序手动构建这些数组,您将获得相同的结果。

    对于奖励,我想说它与“如果两个成员比较相等,则它们在排序数组中的相对顺序是未定义的。”。所以这只是巧合而已。

    【讨论】:

    • 我认为你已经用“对$data键应用相同的排序”一针见血了。经过进一步测试,我可以确认您的回答。这让我想知道,array_multisort() 是 SQL 的 ORDER BY 子句的可行替代品吗?
    • 我已经设法通过使用uasort() 实现了多排序,并且它不会产生“奖励”行为。啊,决定,决定!对于未来的 Google 员工,请参阅 the-art-of-web.com/php/sortarray/#section_3 ;-)
    • @MonkeyZeus 我想如果你正在做某种挑战,你被明确禁止使用ORDER BY。不过,我认为我不会选择 使用它来代替ORDER BY。发生的事情几乎没有那么透明,您需要排序的列越多,它就会变得越复杂。有趣的是,即使the comments in the source code 也将底层排序称为“魔术”。是的,我也测试了简单的排序功能,也注意到了这一点。当他们说“未定义”时,他们不是在开玩笑
    • 哈,真的很神奇!我模仿 SQL 的排序语法糖的用例很简单。我正在拉入一个 RSS 提要,将其转换为数组,默认情况下需要按 pubDate desc, title asc 对其进行排序。我还在构建通过$_GET 接受排序顺序的选项,因此事情可能会变得“疯狂”。例如?sort[title]=desc&amp;sort[pubDate]=asc
    • 很高兴为您提供帮助。随时。很高兴有一个有趣的问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多