2014-07-03 112 views
0

我有一個簡單的while循環,我正在使用PHP來生成動態菜單。PHP代碼不讀取URL

僞代碼示例工作得很好:

<!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?v=fooalphabar測試,它工作正常,但如果我將文件命名爲alpha.php運行30秒,超時。我假設這是因爲PHP對待不同於參數的路徑,但有沒有辦法讓這個工作? 「回聲」表明它確實拉動while循環中的「alpha」。我也試過其他東西,如$_SERVER["PHP_SELF"]$_SERVER["SCRIPT_NAME"]或設置一個變量爲$_SERVER['REQUEST_URI']但沒有骰子。

+0

如果這一點是循環遍歷'$ allMenus'數組,那麼爲什麼不這樣做而不是運行一個潛在的無限循環?至少你會將迭代次數限制在數組的大小 –

+2

代碼的*目的是什麼?你想在比較strpos時使用'==='運算符,因爲它可以返回'false'或'0',這兩個等於false。如果它永遠不匹配,它也永遠不會結束。你最好使用'foreach'而不是'while'。 –

+1

以錯字結束。正確的比較運算符是'===',如[docs](http://php.net/strpos)所示。 –

回答

0

目前還不清楚你的代碼的目的是什麼,但下面的代碼非常相似並利用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 
+1

我希望接受的答案是你指出我需要的那個===。不太相信「爲」在「這裏」「跳動」,看到我上面的評論,當然你可以提供任何解釋 –

+0

foreach比較容易閱讀如果你迭代數組中的每一項,一個好的工作,並清楚發生了什麼以及如何訪問數組的當前索引(在這種情況下,'$ menu_name')。您也不需要'$ i'計數器,並且foreach甚至可以使用關聯數組,它只適用於這種類型的循環,這並不意味着你不能使用'while'或'for'循環(不要和forEACH混淆)。 –

+0

沒有冒犯,但我不會對for,foreach和while之間的區別感到困惑。我不需要遍歷每個項目。只需要循環,直到找到它所需的一個。 –

0

也提供了更好的選擇:

而不是把自己容易發生這種無限循環,嘗試:

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

請參閱我上面的意見。我不需要瀏覽其餘的數據。所以我不確定我看到如何突破「for」比結束「while」更好,但我可以接受任何可能的解釋。 –

+1

你的'while'容易受到無限循環的影響。 'foreach'保證終止。 –