2012-06-13 56 views
1

我正在嘗試更新我的網址。我有一個mod_rewrite查找以'.php?slug = [some + text]'結尾的文件,並用'/ [some + text]'替換。但是,這不會讓您在一個url中存儲多個變量,而不會顯得雜亂無章。高級網址參數

我試圖寫一個PHP腳本,需要一個URL看起來像:

.php?slug=search/this+is+a+search/tags/php+sql/page/2 

應與

array(
    'search'->'this is a search', 
    'tags'->'php sql', 
    'page'->2 
); 

我有這麼遠替換它。

if(isset($_GET['slug'])&&$_GET['slug']!=''){ 
$url=$_GET['slug']; 
$params=explode(DIRECTORY_SEPARATOR,$url); 
print_r($params); 
} 

這將返回:

Array ( 
    [0] => search 
    [1] => this is a search 
    [2] => tags 
    [3] => php sql 
    [4] => page 
    [5] => 2 
) 

我如何可以轉換到陣列的頂部?有一個更好的方法嗎?

一種方式我和身邊玩耍後發現:

if(isset($_GET['slug'])&&$_GET['slug']!=''){ 
    $url=$_GET['slug']; 
    $params=explode(DIRECTORY_SEPARATOR,$url); 
    $out=array(); 
    $array_size = count($params); 
    for($i = 0; $i < $array_size; $i+=2) 
    { 
     $key=$params[$i]; 
     $value=$params[$i+1]; 
     $out[$key]=$value; 
    } 
    print_r($out); 

} 

這類作品。

回答

1

這將做到這一點:

$params = array_combine(array_map(function($a) {return $a[0];},$tmp = array_chunk($params,2)),array_map(function($a) {return $a[1];},$tmp)); 

一襯!

請注意,你並沒有真正實現任何目標。比較:

somefile.php?search=some+text&tags=php+sel&page=2 
somefile/search/some+text/tags/php+sel/page/2 

除了刪除擴展名,你沒有得到任何東西。你只需要解析一個複雜的字符串就可以讓自己更加努力。

+0

我同意,頁面應該是一個GET變量,其餘的可以是URL的一部分。 'somefile/search/some + text?tags = php + sel&page = 2' – Xeoncross

+0

這不起作用,只是爲我的電腦返回一個錯誤。 – Bonzo

+0

就像我應該神奇地知道錯誤是什麼... –

1

我可能會用.htaccess文件做所有的工作。

RewriteRule ^([A-Za-z0-9]+)/?$ index.php?search=$1 [QSA] 
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/?$ index.php?search=$1&tags=$2 [QSA] 
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)/?$ index.php?search=$1&tags=$2&page=$3 [QSA] 

然後,所有你必須做的是訪問每一個這樣的:

<?php 
$search = $_GET['search']; 
$tags = $_GET['tags']; 
$page = $_GET['page']; 
?> 

注:[QSA]意味着你仍然可以有整潔的人後凌亂的URL變量。如果你想傳遞一個布爾值或者一個id,但是不介意它看起來很亂,這很方便。

我知道這不是你問的問題,但你可能會發現這樣更容易。

+0

謝謝。但是,如果只有搜索和頁面會發生什麼。我試圖這樣做的方式意味着你可以以任何順序或三者的任何可能的組合 - 所以任意組合一個或兩個標籤。 – Bonzo

+0

您可以以任何組合方式進行此操作,但不能以任何順序進行。如果你想這樣做,按照其他答案,但這是最好的方式。 –

0

您可以使用數組鍵的第一個值破壞/上的字符串。

//$url = $_SERVER['REQUEST_URI']; 
//$url = $_GET['slug']; 
$url = 'search/this+is+a+search/tags/php+sql/page/2'; 

preg_match_all('~([^/]+)/([^/]+)~', $url, $matches, PREG_SET_ORDER); 

$values = array(); 
foreach($matches as $match) 
{ 
    $values[$match[1]] = $match[2]; 
} 

print_r($values);