for(each)-循环中的if语句.继续还是什么都没有


if-statement in a for(each)-loop. continue vs nothing

让我们考虑以下数组:

$data = array(
    '0' => array(
        'id' => '0',
        'guid' => '22dd39bf-f6d6-4283-b87c-370354a7c2dd',
        'age' => '32',
        'name' => 'Harriet Vazquez',
        'gender' => 'female',
        'email' => 'harrietvazquez@applica.com',
        'tags' => array(
            '0' => 'sit',
            '1' => 'mollit',
            '2' => 'cillum',
            '3' => 'irure',
        ),
        'friends' => array(
            '0' => array(
                'id' => '0',
                'name' => 'Long Dejesus',
            ),
            '1' => array(
                'id' => '1',
                'name' => 'Carrillo Hodge',
            ),
            '2' => array(
                'id' => '2',
                'name' => 'Coffey Greene',
            ),
            '3' => array(
                'id' => '3',
                'name' => 'Stephanie Chavez',
            ),
            '4' => array(
                'id' => '4',
                'name' => 'Richmond Mitchell',
            ),
        )
    ),
    '1' => array(
        'id' => '1',
        'guid' => '3df3ae55-03f3-4d7d-9c70-c7010a100886',
        'age' => '36',
        'name' => 'David Lynch',
        'gender' => 'male',
        'email' => 'davidlynch@applica.com',
        'tags' => array(
            '0' => 'id',
            '1' => 'ad',
            '2' => 'labore',
            '3' => 'ad',
            '4' => 'veniam',
            '5' => 'nulla',
        ),
        'friends' => array(
            '0' => array(
                'id' => '0',
                'name' => 'Diana Watts',
            ),
            '1' => array(
                'id' => '1',
                'name' => 'Patty Crawford',
            ),
            '2' => array(
                'id' => '2',
                'name' => 'Terrell Larson',
            ),
        )
    ),
    '2' => array(
        'id' => '2',
        'guid' => 'da2c9f3f-ac85-4dfd-a43c-e55e476596ca',
        'age' => '25',
        'name' => 'Hardin Murphy',
        'gender' => 'male',
        'email' => 'hardinmurphy@applica.com',
        'tags' => array(
            '0' => 'laborum',
            '1' => 'labore',
            '2' => 'dolor',
            '3' => 'excepteur',
            '4' => 'est',
        ),
        'friends' => array(
            '0' => array(
                'id' => '0',
                'name' => 'Mandy Roberts',
            ),
            '1' => array(
                'id' => '1',
                'name' => 'Walker Young',
            ),
            '2' => array(
                'id' => '2',
                'name' => 'Middleton Baldwin',
            ),
            '3' => array(
                'id' => '3',
                'name' => 'Tillman Harmon',
            ),
        )
    )
);

现在让我们创建一个具有某些条件的循环

$accepted = array('age', 'name', 'email');
foreach ($data as $idx => $row) 
{
    foreach ($row as $key => $value) 
    {
        if(!is_array($value) && in_array($key, $accepted))
        {
            var_dump($value) . PHP_EOL;
        }
    }
}

上面的代码将产生这样的输出:

string(2)"32"string(15)"Harriet Vazquez"字符串(26)"harrietvazquez@applica.com"字符串(2)"36"string(11)"David Lynch"字符串(22)"davidlynch@applica.com"string(2)"25"string(13)"Hardin Murphy"字符串(24)"hardinmurphy@applica.com"

现在的问题:如果在else语句中添加continue语句,会有什么不同吗?

$accepted = array('age', 'name', 'email');
foreach ($data as $idx => $row) 
{
    foreach ($row as $key => $value) 
    {
        if(!is_array($value) && in_array($key, $accepted))
        {
            var_dump($value) . PHP_EOL;
        }
        else
        {
            continue;
        }
    }
}

Continue会跳过当前迭代中的其余代码,因为没有代码可以跳过,所以第二个解决方案的速度会慢很多(再执行一次操作,就没用了)。

来自PHP文档:

continue在循环结构中用于跳过当前循环迭代并在条件下继续执行评估,然后开始下一次迭代。

它基本上是一个到达当前循环迭代结束的goto,在这样的情况下会很有用:

foreach ($row as $key => $value) 
{
    if ($value == "whatever")
    {
        continue;
    }
    function1($value);
    // Whatever code here
    // The continue will skip the above code
}

是的,有一个轻微的性能差异:后一个版本运行O(1)的速度较慢,值为1。

原因是,脚本的解析(或者不妨称之为"编译")阶段会运行得稍微慢一点,但我确信两个版本的字节码将具有相同的运行时属性(如果不相同)。