相关疑难解决方法(0)

PHP'foreach'如何实际工作?

让我通过说我知道它是什么foreach,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach".


很长一段时间,我认为这foreach与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.

让我说明我的意思.对于以下测试用例,我们将使用以下数组:

$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

测试案例1:

foreach ($array as $item) {
  echo "$item\n";
  $array[] = $item;
}
print_r($array);

/* Output in loop:    1 2 3 4 5
   $array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)

这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:

测试案例2:

foreach ($array as $key => $item) {
  $array[$key + 1] = $item + 2;
  echo "$item\n";
}

print_r($array);

/* Output …
Run Code Online (Sandbox Code Playgroud)

php iteration foreach loops php-internals

1926
推荐指数
7
解决办法
39万
查看次数

如何解决每个PHP已弃用的功能

使用PHP 7.2,each不推荐使用.文件说:

警告此功能自PHP 7.2.0起已废弃.非常不鼓励依赖此功能.

如何更新我的代码以避免使用它?这里有些例子:

  1. $ar = $o->me;
    reset($ar);
    list($typ, $val) = each($ar);
    
    Run Code Online (Sandbox Code Playgroud)
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = each($out);
    
    Run Code Online (Sandbox Code Playgroud)
  3. for(reset($broken);$kv = each($broken);) {...}
    
    Run Code Online (Sandbox Code Playgroud)
  4. list(, $this->result) = each($this->cache_data);
    
    Run Code Online (Sandbox Code Playgroud)
  5. // iterating to the end of an array or a limit > the length of the array
    $i = 0;
    reset($array);
    while( (list($id, $item) = each($array)) || $i < 30 ) {
        // code
        $i++;
    }
    
    Run Code Online (Sandbox Code Playgroud)

php

50
推荐指数
6
解决办法
5万
查看次数

标签 统计

php ×2

foreach ×1

iteration ×1

loops ×1

php-internals ×1