我正在尝试在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中有一种简单的方法吗?
答案 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);
获得此数组后,将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
)