我有这个数组:
$array = array('abc123', 'ac123', 'tbc123', '1ac123');
我想比较每个字符串并找到最长的公共子字符串。在上面的示例中,结果为c123
。
答案 0 :(得分: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”,就像它是数组
中所有字符串的最大匹配一样
我认为你想要做的就是根据字符串长度(即首先是最小的字符串长度)对上面的输出进行排序,然后取第一项:
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);
答案 1 :(得分:0)
in_array($find, $array);
如果它在数组中,则返回true,但它必须是完全匹配,在你的情况下它不会发现'ac123'。
如果你想看看它是否包含字符串,那么你需要遍历数组并使用preg_match()或类似的
答案 2 :(得分:0)
您可以将array_filter与回调一起使用。
$output = array_filter ($input, function ($elem) { return false !== strpos ($elem, 'c123'); });
答案 3 :(得分:0)
<?php
$array1 = array('abc123', 'ac123', 'tbc123', '1ac123');
if (in_array("c123", $array1)) {
echo "Got c123";
}
?>
答案 4 :(得分:0)
您可以使用此处使用的in_array http://codepad.org/nOdaajNe 或者使用可以使用此处使用的array_search http://codepad.org/DAC1bVCi
看看它是否可以帮到你..
文档链接:http://php.net/manual/en/function.array-search.php和http://www.php.net/manual/en/function.in-array.php