Why/how 这个 array_multisort() 有用吗?

Why/how does this array_multisort() work?

代码:

<?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

我不打算 post 这个作为答案,但我只需要几个额外的字符。

我不能明确地说它是如何 在技术层面上做到的,但我认为具体解决 "How did array_multisort() know to apply the sorting result of $counts to the count sub-key",答案是 "it didn't" .更改子键,您会得到相同的结果。也许我没有按照您的预期方式阅读您的问题,但您似乎在问它如何知道查看 $data 的子键值然后进行排序。但事实并非如此。它查看 $names 的排序方式(查看 $counts 的排序方式)并将相同的排序应用于 $dataprimary 键。这意味着它会查看将哪个原始位置移动到哪个新位置。您的第一个数组是由一个子键的值组成而第二个数组是由另一个子键的值组成的这一事实是无关紧要的。以相同的顺序手动构建这些数组,您将获得相同的结果。

对于奖金,我会说它与 "If two members compare as equal, their relative order in the sorted array is undefined." 有关。所以这只是巧合。