PHP代码不读取URL
我有一个简单的while循环,用于使用PHP生成动态菜单 虚拟代码示例工作得很好: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
<!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之间的区别。我不需要迭代每个项目。只需要循环,直到找到它需要的项目。