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

时间:2013-09-14 13:26:49

标签: php regex arrays string

我正在尝试在PHP中创建一个变量数组,以便根据字符串中文本的顺序在数组中对变量进行排序。

例如,如果我有字符串$s = "Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday",并且我有一个字符串数组$strings = array("Monday", "Tuesday", "Wednesday", etc.);,我想通过$s检查,直到我发现它的一部分匹配一个$strings中的字符串。然后,我将按日期在$listofdays中显示的顺序,将表示每天数据的变量添加到数组,$s

之后,根据$listofdays

的顺序,($tues_data, $thurs_data, $mon_data, etc.)看起来像$s

在PHP中有一种简单的方法吗?

3 个答案:

答案 0 :(得分:1)

如果我理解,你想根据你的字符串$s的顺序来检查元素是否存在于$ strings数组中,例如如果$strings中存在星期二,那么我们将$ Tue_data添加到$ 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);
?>

<强>输出:

Array ( [0] => $Tues_data [1] => $Mon_data [2] => $Wednes_data )

答案 1 :(得分:0)

一种可能的方法是基于具有交替的那些字符串创建单个模式,然后将此模式应用于源字符串。例如:

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);

Demo

获得此数组后,将array_map很容易地转换为您喜欢的任何值。

答案 2 :(得分:0)

听起来我只是想在迭代之前对数组进行排序?

$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 */ }

working example 输出:

Array
(
    [1] => Tuesday
    [3] => Thursday
    [0] => Monday
    [2] => Wednesday
    [4] => Friday
)