Php 从字符串列表中查找下一个匹配字符串

Php 从字符串列表中查找下一个匹配字符串,php,regex,arrays,string,Php,Regex,Arrays,String,我试图在PHP中创建一个变量数组,使变量在数组中按照字符串中文本的顺序排序 例如,如果我有字符串$s=“星期二、星期四、星期一、星期天、星期三、星期六、星期五”,我有一个字符串数组$strings=array(“星期一”、“星期二”、“星期三”等),我想检查$s,直到找到与$strings中的一个字符串匹配的部分。然后,我将向数组中添加一个表示每天数据的变量,$listofdays,按照日期在$s中的显示顺序 因此,之后,$listofdays看起来像($tues\u data、$thurs\u

我试图在PHP中创建一个变量数组,使变量在数组中按照字符串中文本的顺序排序

例如,如果我有字符串
$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 */ }

变量数组??它们已经定义了吗?变量数组??它们已经定义了吗?