【问题标题】:PHP array_multisort unexpected influencePHP array_multisort 意想不到的影响
【发布时间】:2014-01-09 07:04:59
【问题描述】:

我使用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);

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你可以查看脚本

【问题讨论】:

  • 我宁愿说这是一些旧版本 PHP 中的错误...
  • array_multisort单个数组一起使用的原因是什么?
  • 这只是部分代码有问题,在主脚本中有数组,我合并了它们

标签: php arrays sorting


【解决方案1】:

您的问题似乎是不同版本的 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);

?>

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

另外,在PHP.net docs中明确指出:

为了能够在循环内直接修改数组元素 在 $value 之前加上 &。在这种情况下,该值将由 参考。

【讨论】:

  • 编辑了我的答案,以更清楚地解释通过 foreach 引用的概念。
【解决方案2】:

我认为正在发生的事情是,您正在获取(在代码的第一个版本中)数组的副本。这是 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

【讨论】:

  • 我只有一个版本的代码,但在不同版本的 PHP 上进行了测试。
  • 但是主要的问题不是如何让它工作,而是这个问题是怎么出现的。因为,比如我的PHPv =5.0.0,我会有一个不错的结果,甚至不在其他版本上测试。已经在所有版本上测试了所有代码?我不这么认为
  • 我明白了。当 PHP 5 首次发布时,我遇到了类似的问题。我只能告诉你,你应该在升级之前在新版本中运行你的测试,没有其他安全的方法可以做到这一点。但这会随着每项技术的每次版本更改而发生。
  • ehh,但是例如,我的部分代码(模块)我的大学可以用另一个 PHPv 承担另一个项目,我们会遇到问题。也许有任何合乎逻辑的答案为什么会发生。
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多