for(each) 循环中的 if 语句。继续 vs 没有

Posted

技术标签:

【中文标题】for(each) 循环中的 if 语句。继续 vs 没有【英文标题】:if-statement in a for(each)-loop. continue vs nothing 【发布时间】:2013-07-17 21:52:38 【问题描述】:

让我们考虑以下数组:

$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;

        
    

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

字符串(2)“32” string(15) "哈丽特·巴斯克斯" 字符串(26)“harrietvazquez@applica.com” 字符串(2)“36” 字符串(11)“大卫林奇” 字符串(22)“davidlynch@applica.com” 字符串(2)“25” string(13) “哈丁·墨菲” 字符串(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 是多余的。它对性能的影响可以忽略不计。这里有更大的问题吗? @MikeW 我正在尝试找出如何正确使用continue。我看到了这样的代码,我想知道自己是否有任何理由这样做......正如你已经说过的,它是多余的,似乎完全没用 好吧,我想你已经找到了一种使用continue的方法不正确 【参考方案1】:

Continue 跳过当前迭代中的其余代码,因为没有要跳过的代码,您的第二个解决方案将慢得微不足道(多一个操作,但没用)。

来自PHP doc:

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

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

foreach ($row as $key => $value) 

    if ($value == "whatever")
    
        continue;
    

    function1($value);
    // Whatever code here

    // The continue will skip the above code

【讨论】:

【参考方案2】:

是的,有一点性能差异:后一个版本的运行速度会慢 O(1),因为值 1 非常小。

原因是,脚本的解析(或者也可以称之为“编译”)阶段的运行速度会慢一点,但我很确定两个版本的字节码将具有相同的运行时属性(如果它不相同)。

【讨论】:

不仅编译,PHP 还必须执行 continue,这可能什么都不做,但会有一个条件来评估。 PHP 将在这两种情况下执行 continue。每个循环都以一个结尾,在编译期间放在那里。无论如何都会评估条件(它属于IF,而不是ELSE

以上是关于for(each) 循环中的 if 语句。继续 vs 没有的主要内容,如果未能解决你的问题,请参考以下文章

java中for each的用法

jquery each和for循环比较

java中的for each循环

Vue.js v-for中能不能嵌套使用v-if

vue3条件语句和循环语句

For 循环语句不读取 if 语句以继续下一次迭代