我正在尝试在交换机中存在特定字符串时编写逻辑。
Ex:String
* * * * *
我的字符串将始终位于每个字符串之间的格式空间中,但字符串长度会有所不同。但是5个空格和5个字符串
其他例子:
0 * * * *
* 0 * * *
* * 12/3 * *
* * 0 0 *
0 0 * * *
* * * 0 0
* * * AA 12
我在这里尝试的是当字符串出现在*
以外的时候写出switch case。我将运行case。
switch(true):
case '0 * * * * ':
echo 'First string has value';
case '`* * 0 0 * `':
echo '3rd & 4th string has value';
case 'A B C AA 12 ':
echo 'All string has value';
等...
我有很多组合,但我不确定开关是否是正确的方法。
OR LOGIC 2:
我应该用空格分解字符串然后使用if条件来检查5个字符串吗?
答案 0 :(得分:1)
有点像这样
$total = 0;
if( preg_match('/([^*\s]+)/', $str, $match ) ){
$total = count( $matches[1]);
}
echo $total;
如果您需要知道它们匹配的位置,请改用
$str = '* 0 * * *';
if( preg_match_all('/([^*\s]+)|\s/', $str, $match ) ){
print_r( $match )
}
结果
array (
0 =>
array (
0 => ' ',
1 => '0',
2 => ' ',
3 => ' ',
4 => ' ',
),
1 =>
array (
0 => '',
1 => '0',
2 => '',
3 => '',
4 => '',
),
)
看到这种方式(基于0的索引)你知道匹配的是什么。匹配在数组索引1中,因此$match[1][n]
,
然后你就可以循环,就像这样
$results = [];
foreach( $match[1] as $m ){
if( strlen($m) > 0 ){
$results[] = "Match at pos $m";
}
}
等等...
优势在于它们*
和其他东西的可能组合是巨大的,这标准化了,所以你只需要担心非*
的东西。想象一下,如果每种可能的组合都有一个案例,就不会发生。
答案 1 :(得分:1)
switch语句本质上与if语句不同:
switch(true){
case true:
echo 'true';
case false:
echo 'false';
case 'foo':
echo 'foo';
}
所以为了回答你的问题,很可能你不能使用switch语句。 您可以使用ArtisticPhoenix's answer中所示的正则表达式,但有时简单性也很好:
$list = [
'0 * * * *',
'* 0 * * *',
'* * 12/3 * *',
'* * 0 0 *',
'0 0 * * *',
'* * * 0 0',
'* * * AA 12',
];
foreach($list as $item){
if(count($cron = explode(' ', $item)) == 5){
echo "Resultset of '$item'<br>";
foreach($cron as $v){
echo "$v<br>";
// So I recommend if statements here.
}
} else {
echo "'$item' is not in the correct format: '". implode(', ', $cron) . "'";
}
}
答案 2 :(得分:1)
你的问题可以/应该在没有正则表达式的情况下解决。根据您希望编写简单英语输出的程度,您可以通过利用某些智能阵列功能来避免使用完整的条件/开关情况。考虑这种方法:
代码:(Demo)
$strings=[
'* * * * *',
'0 * * * *',
'* 0 * * *',
'* * 12/3 * *',
'* * 0 0 *',
'0 0 * * *',
'* * 0 0 0',
'* * * AA 12',
'A B C D E'
];
$positions=['1st','2nd','3rd','4th','5th'];
foreach($strings as $s){
$result=array_intersect_key($positions,array_diff(explode(' ',$s),['*']));
$count=sizeof($result);
if(!$count){
echo "No values found in string.\n";
}elseif($count==5){
echo "String is full of values.\n";
}else{
echo "Values found in: ",implode(', ',$result),"\n";
}
}
输出:
No values found in string.
Values found in: 1st
Values found in: 2nd
Values found in: 3rd
Values found in: 3rd, 4th
Values found in: 1st, 2nd
Values found in: 3rd, 4th, 5th
Values found in: 4th, 5th
String is full of values.
我的3个嵌套数组函数的执行方式如下:
*
的元素并保留键。*
值的元素,使用键查找位置名称以进行显示。与详细的条件重的替代方法相比,此方法应该大大压缩代码块。