多组合逻辑应使用开关或IF

时间:2017-07-05 14:08:24

标签: php logic preg-split

我正在尝试在交换机中存在特定字符串时编写逻辑。

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个字符串吗?

3 个答案:

答案 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个嵌套数组函数的执行方式如下:

  1. 在每个空格上拆分字符串(这假设您的值不包含空格......如果不是这样,则应更改您的值分隔符。)
  2. 从新生成的数组中删除具有值*的元素并保留键。
  3. 仅引用具有非*值的元素,使用键查找位置名称以进行显示。
  4. 与详细的条件重的替代方法相比,此方法应该大大压缩代码块。