相关疑难解决方法(0)

foreach循环中current()的意外行为

这是一个简单的循环

$list = array("A", "B", "C","D");
foreach ($list as $var) {
    print(current($list));
}
Run Code Online (Sandbox Code Playgroud)

输出(演示)

 BBBB   // Output for 5.2.4 - 5.5.0alpha4
 BCD    // Output for 4.4.1
 AAAA   // Output for 4.3.0 - 4.4.0, 4.4.2 - 5.2.3
Run Code Online (Sandbox Code Playgroud)

题 :

  • 有人可以解释一下发生什么事吗?
  • 为什么我没有得到ABCD
  • 即使数组的副本是由foreach我制作的,AAAA但是在当前的PHP稳定版本中没有得到它

注意*我知道我可以简单地使用print $var来自PHP DOC

current - 返回数组中的当前元素current()函数只返回内部指针当前指向的数组元素的值.它不会以任何方式移动指针.如果内部指针指向超出元素列表末尾或数组为空,则current()返回FALSE.

更新1 - 新观察

感谢Daniel Figueroa:只需通过包装current功能,您就可以得到不同的结果

foreach ( $list as $var ) {
    print(item($list));
}

function item($list) { …
Run Code Online (Sandbox Code Playgroud)

php arrays foreach loops

39
推荐指数
1
解决办法
1790
查看次数

为什么current()跳过foreach()语句中的第一个数组元素?

此代码输出:1 1 1 1

我期望0 0 0 0或0 1 2 3

<?php 
$arr = array(0,1,2,3);
foreach($arr as $i)
{
    echo current($arr), ' ';
}
?>
Run Code Online (Sandbox Code Playgroud)

php foreach

6
推荐指数
1
解决办法
166
查看次数

为什么foreach将refcount增加2而不是1?

NikiC在另一个帖子中说:

在[foreach]迭代之前,$array"软复制"用于foreach.这意味着没有实际的副本,但只有zval的refcount $array增加到2.

但是,我的测试代码显示了不同的结果:

$array = array(0, 1, 2);
xdebug_debug_zval('array'); // refcount=1, is_ref=0
                            // so far so good
foreach ($array as $key => $value) {
    xdebug_debug_zval('array'); // refcount=3, is_ref=0
}                               // why is refcount 3 instead of 2?
Run Code Online (Sandbox Code Playgroud)

只需查看代码,我们最多可以看到两个数组变量.

为什么要引用引用计数3

运行2后为什么不引用refcount foreach

php foreach xdebug php-internals

5
推荐指数
1
解决办法
286
查看次数

标签 统计

foreach ×3

php ×3

arrays ×1

loops ×1

php-internals ×1

xdebug ×1