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

2022-08-30 17:31:09

我们都听说过在循环中,我们应该这样做: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
}

出于性能原因(即初始化只会调用一次,而不是每次条件检查都调用)。$countcount()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在这两种情况下都只调用一次函数,还是像第二种情况一样一次又一次地调用函数?for


答案 1

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


答案 2

我认为测试它肯定会回答这个问题。

这是我的代码:

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

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