Php 从字符串列表中查找下一个匹配字符串
我试图在PHP中创建一个变量数组,使变量在数组中按照字符串中文本的顺序排序 例如,如果我有字符串Php 从字符串列表中查找下一个匹配字符串,php,regex,arrays,string,Php,Regex,Arrays,String,我试图在PHP中创建一个变量数组,使变量在数组中按照字符串中文本的顺序排序 例如,如果我有字符串$s=“星期二、星期四、星期一、星期天、星期三、星期六、星期五”,我有一个字符串数组$strings=array(“星期一”、“星期二”、“星期三”等),我想检查$s,直到找到与$strings中的一个字符串匹配的部分。然后,我将向数组中添加一个表示每天数据的变量,$listofdays,按照日期在$s中的显示顺序 因此,之后,$listofdays看起来像($tues\u data、$thurs\u
$s=“星期二、星期四、星期一、星期天、星期三、星期六、星期五”
,我有一个字符串数组$strings=array(“星期一”、“星期二”、“星期三”等)
,我想检查$s
,直到找到与$strings
中的一个字符串匹配的部分。然后,我将向数组中添加一个表示每天数据的变量,$listofdays
,按照日期在$s
中的显示顺序
因此,之后,$listofdays
看起来像($tues\u data、$thurs\u data、$mon\u data等)
基于$s
在PHP中有一种简单的方法可以做到这一点吗?一种可能的方法是基于这些字符串交替创建一个模式,然后将此模式应用于源字符串。例如:
function getMatches($source, array $strings) {
rsort($strings); // the easiest way to prevent Wed|Wednesday collisions
/* more efficient alternative checks length only:
usort($strings, function($a, $b) {
$al = strlen($a);
$bl = strlen($b);
if ($al === $bl) {
return 0;
}
return $al < $bl ? 1 : -1;
}); */
$pattern = implode('|', array_map('preg_quote', $strings));
preg_match_all("/$pattern/", $source, $matches);
return $matches[0];
}
$strings = array('$Mon', '$Tue', '$W', '$Wed', '$Thu', '$Fri');
$source = '$Tuesday, $Thursday, $Monday, $Sunday, $Wednesday';
$res = getMatches($source, $strings);
函数getMatches($source,array$strings){
rsort($strings);//防止周三冲突的最简单方法
/*更有效的替代检查仅限长度:
usort($strings,function($a,$b){
$al=斯特伦($a);
$bl=斯特伦(b美元);
如果($al==$bl){
返回0;
}
返回$al<$bl?1:-1;
}); */
$pattern=内爆(“|”,数组映射('preg_quote',$strings));
preg_match_all(“/$pattern/”,$source,$matches);
返回$matches[0];
}
$strings=array(“$Mon”、“$Tue”、“$W”、“$Wed”、“$Thu”、“$Fri”);
$source='$周二、$周四、$周一、$周日、$周三';
$res=getMatches($source,$strings);
获得此数组后,很容易将其映射到您喜欢的任何一组值中。一种可能的方法是基于这些字符串交替创建一个模式,然后将此模式应用于源字符串。例如:
function getMatches($source, array $strings) {
rsort($strings); // the easiest way to prevent Wed|Wednesday collisions
/* more efficient alternative checks length only:
usort($strings, function($a, $b) {
$al = strlen($a);
$bl = strlen($b);
if ($al === $bl) {
return 0;
}
return $al < $bl ? 1 : -1;
}); */
$pattern = implode('|', array_map('preg_quote', $strings));
preg_match_all("/$pattern/", $source, $matches);
return $matches[0];
}
$strings = array('$Mon', '$Tue', '$W', '$Wed', '$Thu', '$Fri');
$source = '$Tuesday, $Thursday, $Monday, $Sunday, $Wednesday';
$res = getMatches($source, $strings);
函数getMatches($source,array$strings){
rsort($strings);//防止周三冲突的最简单方法
/*更有效的替代检查仅限长度:
usort($strings,function($a,$b){
$al=斯特伦($a);
$bl=斯特伦(b美元);
如果($al==$bl){
返回0;
}
返回$al<$bl?1:-1;
}); */
$pattern=内爆(“|”,数组映射('preg_quote',$strings));
preg_match_all(“/$pattern/”,$source,$matches);
返回$matches[0];
}
$strings=array(“$Mon”、“$Tue”、“$W”、“$Wed”、“$Thu”、“$Fri”);
$source='$周二、$周四、$周一、$周日、$周三';
$res=getMatches($source,$strings);
获取此数组后,很容易将它映射到您喜欢的任何值集。如果我理解,您希望根据字符串的顺序检查元素是否存在于$strings数组中,例如,如果星期二存在于
$strings
中,那么我们将$Tue\u数据添加到$listofdays中
如果这是您想要的,请尝试以下方法:
<?php
$s = "Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday";
$strings = array("Monday", "Tuesday", "Wednesday",);
$ss=explode(',',str_replace(' ','', $s));
foreach($ss as $day){
if(in_array($day,$strings)){
$varName = explode('day',$day);
//$listofdays[]=${$varName[0].'_data'};//contains values of variables $Tues_data..
$listofdays[]='$'.$varName[0].'_data';//Contains literal string '$Tues_data' etc...
}
}
print_r($listofdays);
?>
如果我理解,您希望根据字符串的顺序检查元素是否存在于$strings数组中,例如,如果星期二存在于
$strings
中,那么我们将$Tue_数据添加到$listofdays中
如果这是您想要的,请尝试以下方法:
<?php
$s = "Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday";
$strings = array("Monday", "Tuesday", "Wednesday",);
$ss=explode(',',str_replace(' ','', $s));
foreach($ss as $day){
if(in_array($day,$strings)){
$varName = explode('day',$day);
//$listofdays[]=${$varName[0].'_data'};//contains values of variables $Tues_data..
$listofdays[]='$'.$varName[0].'_data';//Contains literal string '$Tues_data' etc...
}
}
print_r($listofdays);
?>
在我看来,你只是想在遍历数组之前对数组进行排序
$order = 'Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday';
$array = array('Monday', 'Tuesday', 'Wednesday','Thursday', 'Friday');
uasort($array, function($a, $b) use($order){
$x = strpos($order, $a);
$y = strpos($order, $b);
return $x<$y ? -1 : ($x==$y ? 0 : 1);
});
print_r($array); // foreach($array as $day){ /* etc */ }
在我看来,你只是想在遍历数组之前对数组进行排序
$order = 'Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday';
$array = array('Monday', 'Tuesday', 'Wednesday','Thursday', 'Friday');
uasort($array, function($a, $b) use($order){
$x = strpos($order, $a);
$y = strpos($order, $b);
return $x<$y ? -1 : ($x==$y ? 0 : 1);
});
print_r($array); // foreach($array as $day){ /* etc */ }
变量数组??它们已经定义了吗?变量数组??它们已经定义了吗?