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

Bol*_*ock 24 php arrays performance foreach loops

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

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

而不是这个:

for ($i = 0; $i < count($array); ++$i)
{
    // Do stuff while traversing array
}
Run Code Online (Sandbox Code Playgroud)

出于性能的考虑(即初始化$count会一直呼吁count()的,而不是调用只有一次,count()每条件检查).

如果foreach我在循环中执行此操作,那么它是否会产生影响:

$array = do_something_that_returns_an_array();

foreach ($array as $key => $val)
{
    // Do stuff while traversing array
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

foreach (do_something_that_returns_an_array() as $key => $val)
{
    // Do stuff while traversing array
}
Run Code Online (Sandbox Code Playgroud)

假设情况允许我使用?也就是说,PHP在这两种情况下只调用一次函数,还是像for第二种情况一次又一次调用函数的情况一样?

Amb*_*ber 38

foreach()使用迭代器实现的 -因而它只调用,一旦返回一个数组的函数,然后使用它指向设定为继续与每个项目的现有结果的迭代.


Naw*_*Man 9

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

这是我的代码:

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";
Run Code Online (Sandbox Code Playgroud)

这是结果:

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

他们都读了一次呼叫功能.所以没什么不同.


dec*_*eze 8

foreach制作输入数组的副本,并在每次迭代中处理它.所以你可以使用foreach (do_something_that_returns_an_array() as $key => $val),它只会打电话do_something_that_returns_an_array()一次.

  • 这个措辞不太正确.从技术上讲,PHP数组是写时复制的,所以当你说数组被复制时,措辞最多是模棱两可的,最糟糕的是误导.返回值只是"按原样"使用. (2认同)