我有字符串:
$string = 'michelinx-icexi3xl92t';
OR
$string = 'michelinx-icexi2xl92t';
和数组
$array = array( 0 => 'x-ice', 1 => 'x-icenorth', 2 => 'x-icexi2', 3 => 'x-icexi3');
我正在做的是:
foreach($array as $key => $arr)
{
if(strstr($string, $arr)){
//some code here
break;
}
}
在这两种情况下,当$ key == 0时,此代码停止; 但我需要在$ key == 3或2或其他键时停止它,这更好地匹配字符串
任何建议怎么做?
答案 0 :(得分:3)
找到匹配的第一个字符串后,您当前的代码会停止。从问题来看,您的要求似乎是找到匹配的最长字符串。因此,如果您安排最长的字符串始终首先显示,则可以使用现有代码而无需修改。
所以这里是如何使用自定义排序按字符串长度降序对字符串数组进行排序:
$array= array(0 => 'x-ice', 1 => 'x-icenorth', 2 => 'x-icexi2', 3 => 'x-icexi3');
usort($array, function($a, $b) { return strlen($b) - strlen($a); });
这种方法还有一个优点,就是你不会花费任何时间搜索你将要丢弃的结果(一旦你找到第一场比赛,你已经知道它也是最好的)所以在大多数情况下它会跑得更快。
但是,您的代码也有一个必须修复的错误:在一般情况下,您无法像这样测试返回值strstr
(如果您搜索{它将失败) {1}})。使用"0"
也会更快,如下所示:
strpos
答案 1 :(得分:0)
试试这个
foreach($array as $key => $arr)
{
if(strstr($string, $arr)){
//some code here
if($key == 3)
break;
}
}
答案 2 :(得分:0)
您可以尝试使用此代码查找更匹配的字符串:
$string = 'michelinx-icexi3xl92t';
$array = array( 0 => 'x-ice', 1 => 'x-icenorth', 2 => 'x-icexi2', 3 => 'x-icexi3');
$matchedStr = "";
foreach($array as $key => $val) {
if(strstr($string, $val) && strlen($val) > strlen($matchedStr)) {
//some code here
$matchedStr = $val;
}
}
echo "matched string is: " . $matchedStr;
<强>输出:强>
matched string is: x-icexi3
答案 3 :(得分:0)
试试这个:
foreach($array as $key => $arr)
{
if(strstr($string, $arr)){
//some code here
break;
}
if($key == 3) break;
}
答案 4 :(得分:0)
如果要遍历整个数组,请删除中断。
答案 5 :(得分:0)
最好的解决方案是,按字符串长度对数组进行降序排序,即
$array = array( 0 => 'x-ice', 1 => 'x-icenorth', 2 => 'x-icexi2', 3 => 'x-icexi3');
将成为
$array = array( 0 => 'x-icenorth', 1 => 'x-icexi2', 2 => 'x-icexi3', 3 => 'x-ice');
然后做:
foreach($array as $key => $arr)
{
if(strstr($string, $arr)){
//some code here
break;
}
}
答案 6 :(得分:0)
我知道你想在数组中找到最匹配的字符串。要做到这一点,你可以这样做:
$most_matched_pos = 0;
$most_matched_len = 0;
foreach($array as $key => $val) {
$cur = strlen(strstr($string, $val));
if($cur > $most_matched_len ) {
$most_matched_len = $cur;
$most_matched_pos = $key;
}
}
echo "The most matched is {$array[$most_matched_pos]} ";
根据您的示例,您有此输出:
最匹配的是x-icexi3