2013-03-15 53 views
2

之间最大的重叠我有此数组:PHP:找到多个字符串

$array = array('abc123', 'ac123', 'tbc123', '1ac123'); 

我想比较每个字符串,彼此找到最长公共子。在上面的例子中,结果将是c123

+0

找什么方法?获取所有具有c123的元素 – 2013-03-15 09:52:57

+1

作为结果你期望什么? – deceze 2013-03-15 09:53:06

+0

你想要什么?意味着$ find存在或不存在于您的数组中,或$ find的索引... – 2013-03-15 09:53:56

回答

9

更新

我已经完全误解了这个问题;其目的是要找到一个字符串数组之间最大的重叠:我不是在递归很大

$array = array('abc123', 'ac123', 'tbc123', '1ac123'); 

function overlap($a, $b) 
{ 
     if (!strlen($b)) { 
       return ''; 
     } 

     if (strpos($a, $b) !== false) { 
       return $b; 
     } 

     $left = overlap($a, substr($b, 1)); 
     $right = overlap($a, substr($b, 0, -1)); 

     return strlen($left) > strlen($right) ? $left : $right; 
} 

$biggest = null; 
foreach ($array as $item) { 
     if ($biggest === null) { 
       $biggest = $item; 
     } 
     if (($biggest = overlap($biggest, $item)) === '') { 
       break; 
     } 
} 

echo "Biggest match = $biggest\n"; 

,但我相信这应该工作;-)

老答案

我可能会使用preg_grep();它返回它发现根据您的搜索字符串匹配的数组:

$matches = preg_grep('/' . preg_quote($find, '/') . '/', $array); 

或者,你可以使用array_filter()

$matches = array_filter($array, function($item) use ($find) { 
    return strpos($item, $find) !== false; 
}); 

我需要提取值“C123”喜欢它是数组中所有字符串的最大匹配

我想这里你想要做的是然后根据字符串长度对上述输出进行排序(即最小的stri ng长度),然后取第一项:

if ($matches) { 
    usort($matches, function($a, $b) { 
     return strlen($a) - strlen($b); 
    }); 
    echo current($matches); // take first one: ac123 
} 

让我知道如果我错了。


如果你只知道无论$find正好一个元素匹配之后是:

$matching_keys = array_keys($array, $find, true); // could be empty array 

或者:

$matching_key = array_search($find, $array, true); // could be false 

或事件:

$have_value = in_array($find, $array, true); 
+0

这是定义正确的答案,我甚至不知道这个函数xD – aleation 2013-03-15 09:56:56

+0

我觉得没有人理解我: 我有一个数组,我想从这个数组中比较每个字符串,并找到最匹配的最大子字符串数组中的字符串,所以匹配的最大子字符串的结果是“c123” – user1844923 2013-03-15 10:30:53

+0

@ user1844923 Ahhhh!好的,那确实不是很清楚,让我考虑一下。 – 2013-03-15 10:31:33

0
in_array($find, $array); 

返回true,如果它在数组中,但它必须是精确匹配,在你的情况下,它不会FINDE“ac123”。

,如果你想看看它是否包含字符串,那么你通过数组需要循环和使用的preg_match()或类似

+0

我没有值“c123”,问题是如何找到它? – user1844923 2013-03-15 09:54:15

0

你可以使用array_filter机智h回调。

$output = array_filter ($input, function ($elem) { return false !== strpos ($elem, 'c123'); }); 
0
<?php 
$array1 = array('abc123', 'ac123', 'tbc123', '1ac123'); 

if (in_array("c123", $array1)) { 
    echo "Got c123"; 
} 

?>