我使用array_multisort函数完成了一些任务。在编写脚本期间,我做了var_dump
,并根据PHP版本获得了$mainArray
的不同结果。这是代码:
$mainArray = array(
0 =>array(
"key1" => array(7,4,5),
'key2' => array('cc','aa')
)
);
foreach($mainArray as $secondArray){
foreach($secondArray as $array){
array_multisort($array);
}
}
var_dump($mainArray);
4.3.10 - 4.4.9, 5.1.1 - 5.5.7
的输出:
array(1) {
[0]=> array(2) {
["key1"]=> array(3) {
[0]=> int(7)
[1]=> int(4)
[2]=> int(5) }
["key2"]=> array(2) {
[0]=> string(2) "cc"
[1]=> string(2) "aa" }
}
}
但4.3.0 - 4.3.9, 5.0.0 - 5.0.5
的输出我得到排序数组:
array(1) {
[0]=> array(2) {
["key1"]=> array(3) {
[0]=> int(4)
[1]=> int(5)
[2]=> int(7) }
["key2"]=> array(2) {
[0]=> string(2) "aa"
[1]=> string(2) "cc" }
}
}
我知道array_multisort($array)
不会对$mainArray
产生影响,但是:
我真的不明白为什么在第二个变种中它被排序,而在第一个变体中则没有。而且,我应该总是检查不同php版本的脚本吗?
Here您可以查看脚本
答案 0 :(得分:3)
你的问题似乎是在不同版本的PHP中foreach内部的不同处理。请尝试以下方法。
<?php
$mainArray = array(
0 =>array(
"key1" => array(7,4,5),
'key2' => array('cc','aa')
)
);
foreach($mainArray as &$secondArray){
foreach($secondArray as &$array){
array_multisort($array);
}
}
var_dump($mainArray);
?>
正如您可能注意到的那样,我们已将&符号&amp; 包含在foreach循环的值中,因为在foreach循环中PHP5 +中它们是必需的,以解决我们想要引用的值,以便我们可以直接编辑它。这会在较旧的PHP版本中产生错误。
另外,在PHP.net docs中明确指出:
为了能够直接修改循环内的数组元素 使用&amp;前面的$ value。在这种情况下,值将由 参考
答案 1 :(得分:0)
我认为正在发生的事情是,您(在代码的第一个版本中)获得了数组的副本。这是PHP脚本的正常行为。然后对副本进行排序,原始数组保持不变。如果你想要的是对原始数组进行排序,你应该这样做:
foreach($mainArray as &$secondArray){
foreach($secondArray as &$array){
array_multisort($array);
}
}
通过引用得到内部数组。
修改
如果您想要一个始终有效的版本,您只需要替换原始数组的元素。
<?php
$mainArray = array(
0 =>array(
"key1" => array(7,4,5),
'key2' => array('cc','aa')
)
);
foreach($mainArray as $secondIndex=>$secondArray){
foreach($secondArray as $index=>$array){
array_multisort($array);
$secondArray[$index] = $array;
}
$mainArray[$secondIndex] = $secondArray;
}
var_dump($mainArray);
上查看