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
子键的?
对于 $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
我不打算 post 这个作为答案,但我只需要几个额外的字符。
我不能明确地说它是如何 在技术层面上做到的,但我认为具体解决 "How did array_multisort()
know to apply the sorting result of $counts
to the count sub-key",答案是 "it didn't" .更改子键,您会得到相同的结果。也许我没有按照您的预期方式阅读您的问题,但您似乎在问它如何知道查看 $data
的子键值然后进行排序。但事实并非如此。它查看 $names
的排序方式(查看 $counts
的排序方式)并将相同的排序应用于 $data
的 primary 键。这意味着它会查看将哪个原始位置移动到哪个新位置。您的第一个数组是由一个子键的值组成而第二个数组是由另一个子键的值组成的这一事实是无关紧要的。以相同的顺序手动构建这些数组,您将获得相同的结果。
对于奖金,我会说它与 "If two members compare as equal, their relative order in the sorted array is undefined." 有关。所以这只是巧合。
代码:
<?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
子键的?
对于 $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
我不打算 post 这个作为答案,但我只需要几个额外的字符。
我不能明确地说它是如何 在技术层面上做到的,但我认为具体解决 "How did array_multisort()
know to apply the sorting result of $counts
to the count sub-key",答案是 "it didn't" .更改子键,您会得到相同的结果。也许我没有按照您的预期方式阅读您的问题,但您似乎在问它如何知道查看 $data
的子键值然后进行排序。但事实并非如此。它查看 $names
的排序方式(查看 $counts
的排序方式)并将相同的排序应用于 $data
的 primary 键。这意味着它会查看将哪个原始位置移动到哪个新位置。您的第一个数组是由一个子键的值组成而第二个数组是由另一个子键的值组成的这一事实是无关紧要的。以相同的顺序手动构建这些数组,您将获得相同的结果。
对于奖金,我会说它与 "If two members compare as equal, their relative order in the sorted array is undefined." 有关。所以这只是巧合。