PHP类型与strpos()条件和||一起玩杂耍,尽管严格===?

时间:2014-08-03 10:46:44

标签: php casting strpos

除了两个文件(bg177b_s.phpbg177b_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

1 个答案:

答案 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', ));