当前位置: 首页 > 面试题库 >

PHP Foreach通过参考传递:最后一个元素重复吗?

端木阳荣
2023-03-14
问题内容

我刚编写的简单php脚本有一些非常奇怪的行为。我将其减少到重新创建该错误所需的最低限度:

<?php

$arr = array("foo",
             "bar",
             "baz");

foreach ($arr as &$item) { /* do nothing by reference */ }
print_r($arr);

foreach ($arr as $item) { /* do nothing by value */ }
print_r($arr); // $arr has changed....why?

?>

输出:

Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)
Array
(
    [0] => foo
    [1] => bar
    [2] => bar
)

这是应该发生的错误还是某些真正奇怪的行为?


问题答案:

在第一个foreach循环之后,$item仍然是对的引用,该值也被所使用$arr[2]。因此,第二个循环中的每个foreach调用(不是通过引用调用)都会替换该值,并因此替换$arr[2]为新值。

因此,循环1的值$arr[2]变成了$arr[0]‘foo’。
循环2,值和$arr[2]变为$arr[1],即“ bar”。
循环3的值和$arr[2]变为$arr[2]‘bar’(由于循环2)。

实际上,在第二个foreach循环的第一次调用中,值“ baz”实际上丢失了。

调试输出

对于循环的每次迭代,我们将回显的值,$item递归地打印array $arr

运行第一个循环时,我们看到以下输出:

foo
Array ( [0] => foo [1] => bar [2] => baz )

bar
Array ( [0] => foo [1] => bar [2] => baz )

baz
Array ( [0] => foo [1] => bar [2] => baz )

在循环结束时,$item仍指向与相同的位置$arr[2]

当第二个循环运行时,我们看到以下输出:

foo
Array ( [0] => foo [1] => bar [2] => foo )

bar
Array ( [0] => foo [1] => bar [2] => bar )

bar
Array ( [0] => foo [1] => bar [2] => bar )

您会注意到每个时间数组如何将一个新值放入中$item,它也$arr[3]使用相同的值进行更新,因为它们都仍指向相同的位置。当循环到达数组的第三个值时,它将包含该值,bar因为它只是由该循环的上一次迭代设置的。

是虫子吗?

否。这是引用项目的行为,而不是错误。这类似于运行类似的内容:

for ($i = 0; $i < count($arr); $i++) { $item = $arr[$i]; }

foreach循环本质上并不特殊,它可以忽略引用的项目。就像在循环外一样,每次都只是将变量设置为新值。



 类似资料:
  • 问题内容: 我正在使用PhantomJS page.evaluate()进行抓取。我的问题是我传递到Webkit页面的代码是沙盒化的,因此无法访问我的主要幻象脚本的变量。这使得很难使抓取代码通用。 如何将参数推入页面? 问题答案: 我遇到了确切的问题。可以使用一些技巧,因为它也可以接受字符串。 有几种方法可以执行此操作,但是我使用了一个称为的包装器,该包装器接受其他参数以传递给必须在Webkit端

  • 我是新手。有人能解释一下这个代码吗 公开课演示2{ } 结果打印出1,2,3,4,5和10,15,5,3

  • 有人能帮忙吗?我正在尝试获取代表动态生成的智能卡(例如633597015500042010)的按钮的最后一个xpath元素,然后单击它。我尝试了以下方法,但仍然找不到解决方法。我打算捕获的按钮的名称是“Select”。 driver.findElement(by.xpath(“//div[@class='select-item']/div)[last()]”).click();

  • 本文向大家介绍PHP 通过参考,包括了PHP 通过参考的使用技巧和注意事项,需要的朋友参考一下 示例 这使您可以通过引用允许您修改原始变量的函数或元素来传递变量。 通过引用传递不仅限于变量,还可以通过引用传递以下内容: 新声明,例如 foo(new SomeClass) 从函数返回的引用 数组 “按引用传递”的常见用法是修改数组中的初始值,而不会涉及创建新数组或乱丢您的命名空间的程度。通过引用传递

  • 本文向大家介绍JavaScript数组中的第一个元素和最后一个元素?,包括了JavaScript数组中的第一个元素和最后一个元素?的使用技巧和注意事项,需要的朋友参考一下 数组是一组元素。每个元素都有其自己的 索引值。我们可以使用这些索引访问任何元素。但是,对于最后一个元素,直到知道数组中存在的元素数量,我们才知道索引。在这种情况下,我们必须使用逻辑。让我们简要地讨论这些细节。 访问第一个元素 因

  • 问题内容: 我不理解以下示例,可以说我具有以下功能: 为什么#1是正确的解决方案,而#2是错误的解决方案?基本上是一个字典,所以如果我想将参数传递给openX,我认为正确的方法是没有并给出字典。但是python显然不喜欢第二个,并告诉我我给了3个而不是2个参数。那么,这背后的原因是什么? 问题答案: 在第二个示例中,您提供3个参数:文件名,模式和字典()。但是Python期望:2个形式参数和关键字