2011-08-23 51 views
1

我一直在研究一個花哨的路由器/調度員班,現在試圖決定我想如何,我知道它是完美的國際海事組織除性能不是我想從它。它使用了一個路線圖arrap =/forums/viewthread /:id /:page =>'forums/viewthread /(?\ d +)',並通過我的地圖數組用正則表達式來獲得一個匹配,我試圖讓一些更好的東西在一個高流量的網站,這裏是一個開始......沒有正則表達式的PHP路由器

$uri = "forum/viewforum/id-522/page-3"; 

$parts = explode("/", $uri); 
$controller = $parts['0']; 
$method = $parts['1']; 
if($parts['2'] != ''){ 
    $idNumber = $parts['2']; 
} 

if($parts['3'] != ''){ 
    $pageNumber = $parts['3']; 
} 

當我需要幫助的是某個ID和頁面不會出現某個一方或另一方,有時兩個,所以我obvioulsy上面的代碼會不是說,它假設數組項目2始終是id,3始終是頁面,只有當它們存在於URI中且不使用正則表達式時,是否有人可以向我展示將頁面和id與變量進行匹配的實用方法?

你可以看到我到目前爲止在我的正則表達式版本,在這個問題上Is this a good way to match URI to class/method in PHP for MVC

+2

你正試圖解決你還沒有經歷過的問題。你爲什麼認爲路由器會成爲項目的瓶頸?爲什麼不數據庫? – zerkms

回答

1

這似乎更擴展:

$parts = explode("/", $uri); 
$parts_count=count($parts); 
//set default values 
$page_info=array('id'=>0,'page'=>0); 
for($i=2;$i<$parts_count;$i++) { 
    if(strpos($parts[$i],'-')!==FALSE) { 
     list($info_type,$info_val)=explode('-',$parts[$i],2); 
     if(isset($page_info[$info_type])) { 
      $page_info[$info_type]=(int)$info_val; 
     } 
    } 
} 

然後只需使用$ page_info值。您可以通過這種方式輕鬆添加其他值以及更多級別的「/」。

+0

這是awsome,非常好,我可以在未來添加其他東西,謝謝 – JasonDavis

+0

很高興我可以提供幫助。順便說一句,我忘了在循環之外放置count()(以提高性能) - 更新了我的帖子。 – XzKto

+0

好主意,謝謝 – JasonDavis

1
if (! empty($parts['2'])) 
{ 
    if (strpos($parts['2'], 'id-') !== FALSE) 
    { 
     $idNumber = str_replace('id-', '', $parts['2']); 
    } 
    elseif (strpos($parts['2'], 'page-') !== FALSE) 
    { 
     $pageNumber = str_replace('id-', '', $parts['2']); 
    } 
} 

併爲$一部分做同樣的[3]

+0

這看起來像我在找什麼,但還有1個任務,我需要返回沒有附加的id或頁面部分的號碼 – JasonDavis

+0

現在情況如何?它是否完成這項工作? –

+0

未經測試,但looiks良好,謝謝 – JasonDavis