PHP代码不读取URL

PHP代码不读取URL,php,Php,我有一个简单的while循环,用于使用PHP生成动态菜单 虚拟代码示例工作得很好: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>linkpuller.php</title> </head> <body> <?php $allMenus = array("alph

我有一个简单的while循环,用于使用PHP生成动态菜单

虚拟代码示例工作得很好:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>linkpuller.php</title>
</head>
<body>
    <?php
        $allMenus = array("alpha", "bravo", "charlie", "delta", "echo", "foxtrot");
        $i = 0;
        while ((strpos(basename($_SERVER['REQUEST_URI']), $allMenus[$i]) == false) ) {
            $i++;
        }
        $pathResult = $allMenus[$i];
    ?>

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Asperiores deserunt cum blanditiis saepe, pariatur aliquam maiores eos obcaecati ratione sit provident quisquam, ipsa autem tempore quod animi, cupiditate numquam minus.</p>

    <?php
        echo "<h1>$pathResult $i</h1>";
    ?>
</body>
</html>

linkpuller.php
Lorem ipsum dolor sit amet,奉献精英。在这方面,我们需要的是一种温和的生活方式,一种理性的生活方式,一种暂时的生活方式,一种新的铜


我通过调用
linkpuller.php?v=fooalphabar
对其进行了测试,它工作正常,但如果我将文件命名为
alpha.php
,它将运行30秒并超时。我假设这是因为PHP处理的路径不同于参数,但是有没有办法让它工作呢?“Echo”显示它确实从while循环中拉出了“alpha”。我还尝试过其他方法,如
$\u SERVER[“PHP\u SELF”]
$\u SERVER[“SCRIPT\u NAME”]
或将变量设置为
$\u SERVER['REQUEST\u URI']
,但没有骰子。

还提供了更好的选择:

不要让自己倾向于这种无限循环,尝试:

$pathResult = null;
foreach($allMenus as $item) {
    if( strpos(basename($_SERVER['REQUEST_URI']), $item) !== false) {
        $pathResult = $item;
        break;
    }
}

现在还不清楚代码的目标是什么,但是下面的代码非常相似,并且使用了
foreach
而不是
while
循环。如果当前页面与
$allMenus
中的内容匹配,则菜单名将存储在
$current

最后几行用于测试

$allMenus = array("alpha", "bravo", "charlie", "delta", "echo", "foxtrot");
$current = false;

foreach($allMenus as $menu_name) {
  // Check if the $menu_name appears at the beginning of the REQUEST_URI.
  if ( strpos(basename($_SERVER['REQUEST_URI']), $menu_name) === 0 ) {
    $current = $menu_name;
    break; // Stop running the loop, we're done
  }
}

if ( $current ) echo  'The current page is: ' . $menu_name;
else echo 'No menu page was found';

// Test results:
// http://example.org/alpha.php      -- The current page is: alpha
// http://example.org/not-alpha.php  -- No menu page was found

如果这一点是在
$allMenus
数组上循环,为什么不这样做而不是运行一个潜在的无限循环呢?至少这样,您可以将迭代限制为数组的大小。代码的目的是什么?在比较strpo时,您希望使用
==
运算符,因为它可以返回
false
0
,两者都等于false。如果它永远不匹配,它也永远不会结束。您最好使用
foreach
而不是
while
。正确的比较运算符是
==
,如中所示。我不使用for或foreach的逻辑是,因为找到匹配项后,它仍将求值。因此,如果它与第一个匹配,则不需要紧跟其他五个确实解决了这个问题…老兄,这总是愚蠢的事情!RadGH如果你把它作为一个答案发布…你可以使用
break结束循环,或
继续
停止循环的当前迭代,但仍在执行其他迭代。请参阅上面的注释。我不需要浏览其余的数据。因此,我不确定我是否明白打破“for”比终止“while”要好多少,但我愿意接受任何可能的解释。你的
while
容易受到无限循环的影响
foreach
保证终止。我希望接受的答案是你指出我需要的答案==。不太相信这里的“for”beats“while”。请参阅我上面的评论。当然,可以接受您可能提供的任何解释。foreach更容易阅读。如果您迭代数组中的每个项,它会做得很好,并且清楚发生了什么以及如何访问数组的当前索引(在本例中,
$menu\u name
)。您也不需要
$i
计数器,foreach甚至可以与关联数组一起工作。它只适合于这种类型的循环。这并不意味着您不能在
期间使用
或标准
进行
循环(不要与
foreach
混淆).无意冒犯,但我并不混淆for、foreach和while之间的区别。我不需要迭代每个项目。只需要循环,直到找到它需要的项目。