PHPs foreach幕后发生了什么?

时间:2019-01-10 09:45:47

标签: php arrays foreach php-7.1

PHP 7.1中的实验(docker image nanoninja / php-fpm:7.1)

在下一段代码中,所有内容都清楚了:

$arr1 = [1, 2, 3];

foreach ($arr1 as &$value) {
    $value *= 2;
}

我们有一个数组$arr1,并将所有值乘以2。结果:

array(3) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  &int(6)
}

但是此语句中发生了什么:

$arr1 = [1, 2, 3];

foreach ($arr2 = $arr1 as &$value) {
    $value *= 2;
}

两个数组$arr1$arr2的结果将不可更改:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

为什么会发生?我知道在PHP> 7中,foreach适用于数组副本,但适用于$arr1$arr2的数组副本。为什么&不起作用?

1 个答案:

答案 0 :(得分:6)

holder.adapterPosition仅在常规按值模式下使用数组副本,而不在按引用模式下使用。因此,PHP 7中的更改与此代码无关。

但是在第二个代码块中,您没有使用变量作为迭代的数组,因此没有可引用的内容。相反,您有一个表达式,并且表达式的值是数组的副本。从本质上讲,它等效于:

<?php
 $query=mysqli_query($con,"select size.id, size.sizeName, 
         products.productSize from size INNER JOIN products ON 
         size.id=products.productSize WHERE products.id='$pid'");

         while($row = mysqli_fetch_assoc($query)) {

         $size[] = $row['productSize'];

         }

         foreach ($size as $res){

          echo '<option value='.$res['size.id'].'>'.$res['sizeName'].'</option>'; 
             }

?>

这将更新foreach,但不会更新$temp = $array1 = $array2; foreach ($temp as &$value) { $value *= 2; } $temp