1

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

例如,如果我有 string $s = "Tuesday, Thursday, Monday, Sunday, Wednesday, Saturday, Friday",并且我有一个 strings 数组$strings = array("Monday", "Tuesday", "Wednesday", etc.);,我想检查$s直到找到其中的一部分与$strings. 然后,我将一个表示每天数据的变量添加到一个数组中,添加到一个数组$listofdays中,按照日期在 中出现的顺序$s

所以之后,$listofdays看起来像($tues_data, $thurs_data, $mon_data, etc.)基于顺序$s

在 PHP 中是否有一种简单的方法可以做到这一点?

4

3 回答 3

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 )
于 2013-09-14T14:01:48.667 回答
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);

演示

在你得到这个数组之后,很容易将array_map它变成你喜欢的任何一组值。

于 2013-09-14T13:43:17.207 回答
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
)
于 2013-09-14T14:16:14.977 回答