代码之家  ›  专栏  ›  技术社区  ›  BoltClock

php foreach循环中的数组是如何读取的?

  •  24
  • BoltClock  · 技术社区  · 15 年前

    我们都听说过 for 循环,我们应该这样做:

    for ($i = 0, $count = count($array); $i < $c; ++$i)
    {
        // Do stuff while traversing array
    }
    

    而不是这个:

    for ($i = 0; $i < count($array); ++$i)
    {
        // Do stuff while traversing array
    }
    

    出于性能原因(即初始化 $count 会叫 count() 只有一次,而不是打电话 计数() 每次有条件的检查)。

    如果,在 foreach 循环,我这样做:

    $array = do_something_that_returns_an_array();
    
    foreach ($array as $key => $val)
    {
        // Do stuff while traversing array
    }
    

    而不是这个:

    foreach (do_something_that_returns_an_array() as $key => $val)
    {
        // Do stuff while traversing array
    }
    

    假设环境允许我使用这两种方法?也就是说,在这两种情况下,PHP只调用一次函数,还是像这样 对于 第二种情况下会在哪里反复调用函数?

    6 回复  |  直到 12 年前
        1
  •  38
  •   Amber    15 年前

    foreach() implemented using iterators -因此,它只调用一次返回数组的函数,然后使用指向现有结果集的迭代器继续处理每个项。

        2
  •  9
  •   BoltClock    12 年前

    我认为测试肯定能解决这个问题。

    这是我的代码:

    function GetArray() {
        echo "I am called.\n";
        return array("One"=>1, "Two"=>2, "Three"=>3, "Four"=>4, "Five"=>5);
    }
    
    echo "Case #1\n";
    $array = GetArray();
    foreach ($array as $key => $val){
        // Do stuff while traversing array
        echo "    Inside the loop: $key => $val\n";
    }
    echo "\n";
    
    echo "Case #2\n";
    foreach (GetArray() as $key => $val) {
        // Do stuff while traversing array
        echo "    Inside the loop: $key => $val\n";
    }
    echo "\n";
    

    结果是:

    Case #1
    I am called.
        Inside the loop: One => 1
        Inside the loop: Two => 2
        Inside the loop: Three => 3
        Inside the loop: Four => 4
        Inside the loop: Five => 5
    
    Case #2
    I am called.
        Inside the loop: One => 1
        Inside the loop: Two => 2
        Inside the loop: Three => 3
        Inside the loop: Four => 4
        Inside the loop: Five => 5
    

    它们都读取一次调用函数。所以没什么不同。

        3
  •  8
  •   deceze    15 年前

    foreach 生成输入数组的副本,并在每次迭代中对其进行处理。所以你可以使用 foreach (do_something_that_returns_an_array() as $key => $val) 它会召唤 do_something_that_returns_an_array() 只有一次。

        4
  •  4
  •   alex    14 年前

    我会举个例子看看会发生什么。有点像…

    function do_something_that_returns_an_array() {
        echo 'I have been called!'; 
        return array('i am an', 'array');
    }
    

    As you can see on CodePad, it is only being called once .

        5
  •  2
  •   Steven    15 年前

    我一直以为 do_something_that_returns_an_array() 只运行一次,因为与for循环不同,它没有理由运行多次。在每次迭代结束时运行for循环真值检查程序的原因是为了允许非常复杂的检查程序。

    作为测试,我做了以下工作:

    function get_array() {echo 5; return array(1,2,3,4,5);}
    foreach(get_array() as $key => $value) {}
    

    剧本印了5次。因此,功能 get_array() 只计算一次。

        6
  •  0
  •   Valentin Golev    15 年前

    foreach()用于迭代器或迭代器聚合对象(例如,数组和实现接口的对象)。它不能和 不变的 物体。函数返回 不变的 对象,因此返回的数组必须在进行前复制到迭代器对象中(它是由PHP本身生成的)