Как вложить выражение «для» в «если»? - PullRequest
1 голос
/ 27 января 2012

В проекте PHP, над которым я сейчас работаю, у меня есть некоторый код, подобный этому:

$allVarsTrue = TRUE;

if ($foo && $bar) {
  for ($x=1;$x<=5;$x++) {
    if (!somerandomtest($x)) {
      $allVarsTrue = FALSE; // if $x fails the test, $allVarsTrue is set to false
    }
  }
} else { // if either $foo and $bar is false, $allVarsTrue is set to false
  $allVarsTrue = FALSE; 
}

if ($allVarsTrue) {
  echo "True";
} else {
  echo "False";
}

Я хотел бы написать это более кратко, что-то вроде этого

// This code does not work.
if ($foo &&
    $bar &&
    for ($x=1;$x<=5;$x++) {
      somerandomtest($x);
    }) {
  echo "True";
} else {
  echo "False";
}

Как можно более кратко переписать существующий код?

Ответы [ 3 ]

4 голосов
/ 27 января 2012

Один из вариантов - переместить ваш цикл в его собственную функцию:

function performTests() {
  for(…) { if(!test(…)) return FALSE; } # return early, no need to iterate over remaining items
  return TRUE;
}

if($foo && $bar && performTests()) {
  …
} else {
  …
}
3 голосов
/ 27 января 2012

Оберните это в функцию:

function testStuff($foo, $bar){
    if (!$foo || !$bar) {
        return FALSE;
    }
    for ($x=1;$x<=5;$x++) {
        if (!somerandomtest($x)) {
            return FALSE;
        }
    }
    return TRUE;
}

А потом:

if (testStuff($foo, $bar)) {
  echo "True";
} else {
  echo "False";
}
0 голосов
/ 27 января 2012

Вы не можете на самом деле. Тем не менее, вы можете прервать цикл for, как только первый тест не пройден

if ($foo && $bar) {
  for ($x=1;$x<=5;$x++) {
    if (!somerandomtest($x)) {
      $allVarsTrue = FALSE; // if $x fails the test, $allVarsTrue is set to false
      break; //no point in firther iterating
    }
  }
} else { // if either $foo and $bar is false, $allVarsTrue is set to false
  $allVarsTrue = FALSE; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...