为什么/这个array_multisort()如何工作?

时间:2018-07-17 15:45:16

标签: php arrays sorting array-multisort

代码:

<?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的排序结果应用于多维数组count中每个项目的$data子项?

$names子键的name类似。


奖金:

如果在函数调用中未注释$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

1 个答案:

答案 0 :(得分:1)

我不想将其发布为答案,但是我只需要几个额外的字符。

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

对于奖金,我想说这与“如果两个成员比较相等,则它们在排序数组中的相对顺序是不确定的”有关。因此,这比其他任何事情都更是巧合。