PHP array_multisort意外影响

时间:2014-01-09 07:05:00

标签: php arrays sorting

我使用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您可以查看脚本

2 个答案:

答案 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);

http://3v4l.org/Bk1YM

上查看