我需要创建一个将遍历并为条件语句创建条件的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 ||
}
)
那么,这应该能够奏效吗?还是我只是疯了?如果真的没有办法在这样的情况下设置循环,有人可以提出更好的方法来做到这一点吗?非常感谢!
答案 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
}
}