2012-10-29 178 views
1

我有一個字符串(URL路徑),如/recipes/cheese/cheese-meat-loaf和我有路徑的巨型陣列如PHP查找數組中的字符串?

'/recipes/', 
'/content/' 
... 

我要帶我的路,找到相匹配的路徑的一部分數組中的路徑。因此,對於此示例,它將與數組中的/recipes/匹配,因爲路徑包含/ recipes /,但該數組也可能包含/recipes/cheese/,在這種情況下,它應該與此匹配。

所以幾乎我想通過的路徑/之間減去一切,並嘗試匹配它...所以它會做

`/recipes/cheese/cheese-meat-loaf` then if not found 
`/recipes/cheese/` then if not found 
`/recipes/` then if not found 
return default 

,它將巨陣中返回的值(關鍵是路徑)。

我希望它倒退,因爲我只想要一個值,並可能有多個/recipes/*/

但我不確定abouts如何做到這一點。

+0

聽起來像是一個遞歸函數 –

+0

['explode']工作(http://hk1.php.net /manual/en/function.explode.php)可能會幫助你。是的,你可能想使用簡單的代碼遞歸。 –

+0

@JohnConde這將是尾遞歸的,所以在像php這樣的命令式編程語言中,我不會推薦使用遞歸。 – Jasper

回答

2

因爲我們不是在這裏爲你做你的編碼,所以讓我寫一個「配方」讓你自己編寫你的代碼。然後,如果您在途中遇到問題,您可以回到這裏,提出更具體的問題,我們可以更好地幫助您解決問題。

  1. 搜索你的陣列當前搜索字符串
  2. 如果你發現它時,陣列
  3. 在返回值。如果你還沒有找到它,搜索搜索字符串的斜線最後一次出現性格,以及下列一切是
  4. 再次啓動,在1與你的新的搜索字符串,使最長的路徑是先刪除它
0

儘量縮短您的網址在一個循環中通過切斷最後的/你的陣列,使該值搜索:

$arr = array([with many elements]); 
$url = '/recipes/cheese/cheese-meat-loaf'; 
$found = false; 
while ($found === false && $url !== '') { 
    if (in_array($url, $arr)) $found = $url; 
    else { 
    $shorten = preg_replace('/(\/[^\/]*)$/', '', $url); 
    if ($shorten === $url) break; 
    else $url = $shorten; 
    } 
} 
echo $found !== false ? 'found: ' . $url : 'not found'; 

Live example

0

有一個在PHP稱爲explode函數expldes字符串成爲碎片。 explode("/",$inputstring)將返回一個數組。例如:

explode("/",'/recipes/cheese/cheese-meat-loaf'); 

array(
    [0]=>"recipies" 
    [1]=>"cheese" 
    [2]=>"cheese-meat-loaf" 
) 

你也可以爆炸cheese-meat-loaf

0

排序的路徑數組。然後,只需經過,並返回第一個匹配:

$array = array(
    '/recipies', 
    '/recipies/cheese' 
    ); 

$url = "/recipies/cheese/fondue"; 

function lsort($a,$b){ 
    $diff = strlen($b) - strlen($a); 
    return $diff; 
} 

usort($array,'lsort'); 

foreach($array as $path){ 
    echo "Testing $path<br/>"; 
    if(!strncmp($url, $path, strlen($path))){  
     echo "Best match is $path</br/>"; 
     break; 
    } 
} 

樣本輸出:

Testing /recipies/cheese 
Best match is /recipies/cheese