我在 PHP 中有一个非常奇怪的与数组排序相关的问题,这让我完全发疯。我已经用谷歌搜索了几个小时,但仍然没有任何迹象表明其他人有这个问题,或者这应该发生在开始,所以这个谜团的解决方案将不胜感激!
用尽可能少的词来描述问题/问题:当使用 foreach 循环根据多层深度嵌套数组中的值对数组进行排序时,一旦执行离开循环,结果数组排序顺序就会恢复,即使它在循环内工作正常。为什么会这样,我该如何解决?
这是我的问题的示例代码,希望它比上面的句子更清楚:
$top_level_array = array('key_1' => array('sub_array' => array('sub_sub_array_1' => array(1),
'sub_sub_array_2' => array(3),
'sub_sub_array_3' => array(2)
)
)
);
function mycmp($arr_1, $arr_2)
{
if ($arr_1[0] == $arr_2[0])
{
return 0;
}
return ($arr_1[0] < $arr_2[0]) ? -1 : 1;
}
foreach($top_level_array as $current_top_level_member)
{
//This loop will only have one iteration, but never mind that...
print("Inside loop before sort operation:\n\n");
print_r($current_top_level_member['sub_array']);
uasort($current_top_level_member['sub_array'], 'mycmp');
print("\nInside loop after sort operation:\n\n");
print_r($current_top_level_member['sub_array']);
}
print("\nOutside of loop (i.e. after all sort operations finished):\n\n");
print_r($top_level_array);
其输出如下:
Inside loop before sort operation:
Array
(
[sub_sub_array_1] => Array
(
[0] => 1
)
[sub_sub_array_2] => Array
(
[0] => 3
)
[sub_sub_array_3] => Array
(
[0] => 2
)
)
Inside loop after sort operation:
Array
(
[sub_sub_array_1] => Array
(
[0] => 1
)
[sub_sub_array_3] => Array
(
[0] => 2
)
[sub_sub_array_2] => Array
(
[0] => 3
)
)
Outside of loop (i.e. after all sort operations finished):
Array
(
[key_1] => Array
(
[sub_array] => Array
(
[sub_sub_array_1] => Array
(
[0] => 1
)
[sub_sub_array_2] => Array
(
[0] => 3
)
[sub_sub_array_3] => Array
(
[0] => 2
)
)
)
)
如您所见,在循环内的排序操作(如预期的那样)之前排序顺序是“错误的”(即不是按最内层数组中的所需值排序),然后在循环内的排序操作之后变为“正确” (如预期的那样)。
到现在为止还挺好。
但是,一旦我们再次离开循环,顺序突然恢复到原来的状态,好像排序循环根本没有执行?!?
这是怎么发生的,那么我将如何以所需的方式对这个数组进行排序?
我的印象是,无论是 foreach 循环还是 uasort() 函数都不是在相关项目的单独实例上运行(而是在引用上,即就地),但上面的结果似乎表明不是这样?如果是这样,我将如何能够执行所需的排序操作?
(为什么整个互联网上除了我以外的其他人似乎都没有这个问题?)
PS。别管这个例子中要排序的奇怪数组的设计背后的原因,它当然只是一个更复杂代码中实际问题的简化 PoC。