除了两个文件(bg177b_s.php
和bg177b_t.php
)之外,还应添加标题。换句话说,如果两个strpos()
条件都不匹配,则应该做某事,否则什么也没做。
如果strpos()
不会评估为0
,我会以两种方式工作。在后一种情况下,尽管有严格的0
运算符,但似乎PHP将整数FALSE
变为===
。然而,尽管有各种各样的杂耍效果的页面,我找不到匹配这种情况。
PHP strpos not working with boolean or接近于它类似于我的第三个解决方案,但没有解释为什么它不能用strpos()
条件括在||
语句中。
无论如何,我会感激任何指导,很可能我的逻辑在某个地方遇到了障碍。
这是PHP 5.3.5。由于技术原因,此刻不允许更新任何更新的版本,以防行为只是一个错误,而不是对我的误解。
// works (evaluates to FALSE||FALSE or FALSE||9):
if ((strpos($_SERVER['PHP_SELF'], 'bg177b_s') ||
strpos($_SERVER['PHP_SELF'], 'bg177b_t')) === false) {
// do something
}
// so does this (evaluating to FALSE||FALSE or FALSE||1):
$thispage = basename($_SERVER['PHP_SELF']); // eg /hunting/bg177bXX.php
if ((strpos($thispage, 'g177b_s') ||
strpos($thispage, 'g177b_t')) === false) {
// do something
}
// works, but seems clumsy and a waste of resources:
if (strpos($thispage, 'bg177b_s') === false &&
strpos($thispage, 'bg177b_t') === false) {
// do something
}
// doesn't work as expected (evaluates to either FALSE||FALSE [then it works] or
// FALSE||0 [then 0 is seemingly cast as FALSE which is against what is wanted],
// both bg177b_s and bg177b_t are dealt with as being false)
if ((strpos($thispage, 'bg177b_s') ||
strpos($thispage, 'bg177b_t')) === false) {
// do something
}
// doesn't work for bg177b_s (=== seemingly takes precedence over ||)
if (strpos($thispage, 'bg177b_s') ||
strpos($thispage, 'bg177b_t') === false) {
// do something
}
修改
在研究@ halfer的帮助函数时,我想知道如果不是foreach
循环,in_array
甚至array_key_exists
不会更直接,因为已经有一个针阵列。
做一些关于效率的研究 - i。一个。 Efficiency of Searching an Array vs Searching in Text… Which is Better? - 导致依赖。
无论如何,Seldaek的建议让我翻过原来的$haystack
和$needle
,只导致一次strpos
操作:
if (strpos('bg177b_s.php, bg177b_t.php', $thispage) === false)
当然,价格是数组密钥或大海捞针字符串文件名必须至少与$thispage
必须返回的完整一样完整,否则它将无法工作或需要额外的substr
。
答案 0 :(得分:1)
问题不在于PHP错误。这是问题所在:
strpos($thispage, 'bg177b_s') || strpos($thispage, 'bg177b_t')
您正在对两个字符串执行strpos
,然后对结果执行OR
。这会强制结果为布尔值,这会失去零和假之间的差异。
换句话说,如果其中一个函数返回零,则意味着在第0个位置找到了其中一个字符串。这得到了逻辑 - 假(因为可能两者不会同时发生)给你一个不正确的错误结果。
您的第三个代码示例是正确的:
strpos($thispage, 'bg177b_s') === false &&
strpos($thispage, 'bg177b_t') === false
我倾向于使用辅助函数,这简化了调用:
function findOneString($haystack, array $needles)
{
$found = false;
foreach($needles as $needle)
{
if (strpos($haystack, $needle) !== false)
{
$found = true;
break;
}
}
return $found;
}
你可以用以下方式调用:
findOneString($thispage, array('bg177b_s', 'bg177b_t', ));