2013-07-17 5 views
1

Рассмотрим следующий массив:if-statement в a for (each) -loop. продолжать против ничего

$data = array(
    '0' => array(
     'id' => '0', 
     'guid' => '22dd39bf-f6d6-4283-b87c-370354a7c2dd', 
     'age' => '32', 
     'name' => 'Harriet Vazquez', 
     'gender' => 'female', 
     'email' => '[email protected]', 
     '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' => '[email protected]', 
     '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' => '[email protected]', 
     '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" 
string(26) "[email protected]" 
string(2) "36" 
string(11) "David Lynch" 
string(22) "[email protected]" 
string(2) "25" 
string(13) "Hardin Murphy" 
string(24) "[email protected]"

И теперь вопрос: Есть ли какие-либо отличия (и я имею в виду p erformance), если я добавлю заявление continue в заявлении else?

$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; 
     } 
    } 
} 
+0

Что вы пытаетесь достичь здесь? В вашем примере ваш 'continue' является избыточным. Это будет иметь незначительное влияние на производительность. Есть ли еще большая проблема? –

+0

@MikeW Я пытаюсь выяснить, как правильно использовать 'continue'. Я видел такой код, и я задавался вопросом, есть ли причины для этого ... Как вы уже сказали, он избыточен и кажется совершенно бесполезным. –

+0

Ну, я думаю, вы нашли способ использовать 'continue '** неправильно **! –

ответ

2

Продолжить пропускает оставшуюся часть кода в текущей итерации, так как нет никакого кода, чтобы пропустить, ваше второе решение будет незначительно медленнее (одна более операцией, и это бесполезно).

От PHP doc:

продолжают используется в LOOPING структур, чтобы пропустить остаток текущей итерации цикла и продолжить выполнение при оценке состояния , а затем начало следующей итерации.

Это он в основном Гото, который идет до конца текущей итерации цикла, было бы полезно в таком случае, как это:

foreach ($row as $key => $value) 
{ 
    if ($value == "whatever") 
    { 
     continue; 
    } 

    function1($value); 
    // Whatever code here 

    // The continue will skip the above code 
} 
0

Да, есть разница небольшая производительность: последние версия будет работать O (1) медленнее, при очень небольшом значении 1.

Причина в том, что этап синтаксического разбора (или может также называть его «компиляция») сценария будет работать немного медленнее, но я уверен, что байт-код из обеих версий будет иметь одинаковые свойства времени выполнения (если он не идентичен).

+0

Не только компиляция, PHP придется выполнять continue, что, вероятно, ничего не сделает, но будет условие для оценки. –

+0

PHP выполнит продолжение в обоих случаях. Каждый цикл заканчивается на один, который помещается там во время компиляции. Условие все равно оценивается (оно принадлежит 'IF', а не' ELSE') –