2012-10-29 137 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