将foreach循环放在if条件中

时间:2010-08-28 15:49:13

标签: php loops if-statement

我需要创建一个将遍历并为条件语句创建条件的foreach语句。我写了这段代码,没想到它会起作用,当然它没有......

$filename = "whitelist.txt";
$handle = fopen($filename, 'r');
$whitelist = fread($handle, filesize($filename));
fclose($handle);
$whitelist = explode("\n", $whitelist);
if (
  foreach ($whitelist as $value) {
    strpos($ref, 'http://'.$value.'/')===0 ||
  }
)

那么,这应该能够奏效吗?还是我只是疯了?如果真的没有办法在这样的情况下设置循环,有人可以提出更好的方法来做到这一点吗?非常感谢!

4 个答案:

答案 0 :(得分:14)

预先计算值,不能将循环用作表达式:

$val = false;

foreach ($whitelist) {
   $val = $val || strpos($ref, 'http://'.$whitelist.'/')===0;
}

if($val) {
    // ...
}

答案 1 :(得分:1)

您必须反转这两个语句并将if放在for循环中。循环在白名单上,找到匹配后设置一个标志并使用break退出循环。然后在循环后检查该标志,看看它是否已经设置。

$allowed = false;

foreach ($whitelist as $url) {
    if (strpos($ref, "http://$url/") === 0) {
        $allowed = true;
        break;
    }
}

if ($allowed) {
    // Do what you want to do.
}

对于它的价值,还有其他更具表现力的语言,您可以按照您尝试的方式编写代码。例如,在python中,你可以这样写:

if any(ref.starts_with('http://'+url+'/') for url in whitelist):
    # Found a whitelisted URL.

答案 2 :(得分:0)

由于foreach块没有返回任何内容,因此无法完成。

你想要这样的东西:

if (for_any($whitelist,
    function ($arg) use ($ref) { return strpos($ref, 'http://'.$arg.'/')===0; } ) {
    /* ... */
}

function for_any(array $arr, $func) {
    return array_reduce($arr,
        function ($a, $v) use ($func) {
            return $a || call_user_func($func, $v);
        }, true);
}

答案 3 :(得分:0)

计算循环内的条件,而不是事先。

$filename = "whitelist.txt";
$handle = fopen($filename, 'r');
$whitelist = file($handle)
fclose($handle);
foreach ($whitelist as $line) {
    if(strpos($ref, 'http://'.$line.'/')) {
       //do stuff
    }
    else {
      // do not do stuff
    }
}