PHP array_multisort意外影响

ser*_*gio 6 php arrays sorting

我使用array_multisort函数完成了一些任务.在编写脚本的过程中,我做了一个var_dump,并$mainArray根据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);
Run Code Online (Sandbox Code Playgroud)

输出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" } 
   } 
}
Run Code Online (Sandbox Code Playgroud)

但是输出为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" } 
   } 
 }
Run Code Online (Sandbox Code Playgroud)

我知道这array_multisort($array)不会有影响$mainArray但是:

我真的不明白为什么在第二个变体中它被排序,而在第一个变体中则没有.而且,我应该总是检查不同的PHP版本的脚本?

在这里你可以查看脚本

Amb*_*dex 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);

?>
Run Code Online (Sandbox Code Playgroud)

您可能会注意到,我们在 foreach 循环的值中包含了&符号&,因为它们在 PHP5+ 的 foreach 循环中是必需的,以解决我们想要引用该值的问题,以便我们可以直接编辑它。不过,这会在较旧的 PHP 版本中产生错误。

另外, PHP.net 文档中明确指出:

为了能够在循环内直接修改数组元素,请在 $value 之前加上 &。在这种情况下,该值将通过引用分配。