php 中字符串比较条件的 OO 方式或功能方式

OO way or functional way of string comparison conditionals in php

我正在 curl 浏览 returns 只有 html 的特定页面。要确定它 returns 是哪个页面,我只是尝试 stripos curl

的结果

像这样:

$result = curl_exec($ch);
if(stripos($result, 'success') !== false) {
    // do something
} else {
  if (stripos($result, 'foo') !== false) {
      // do something
  } else if (stripos($result, 'foo') !== false) {
      // do something
  } else if (stripos($result, 'bar') !== false) {
      // do something
  } else if (stripos($result, 'bazz') !== false) {
      // do something
  } else {
      // do something
  }
}

我认为这很混乱,如果我正在查看最少的 if 语句或最终 if-less 代码,是否有 OO 方法或功能方法来解决此类问题。

这个简单的函数可以完成这项工作:

function checkWord ($haystack,$needle){
foreach ($needle as $word) {
    if (stripos($haystack, $word) !== false) {
        echo $word." was found!<br/>";
    }
    else{
        echo $word." wasn't found<br/>";
    }
  }
}

checkWord("Hello what's up?",array('Hello','Huhud','up','?'));

这将输出:-

Hello was found!
Huhud wasn't found
up was found!
? was found!

你正在寻找一种抽象的方式。在此示例中,您在案例分析中重复自己,如果 "do something" 非常不同且不一致,这可能是最好的方法。

$map = [ 'success' => function () { return 1; }, 
         'foo'     => function () { return 2; }, 
         'bar'     => function () { return 3; }, 
         'bazz'    => function () { return 4; } ];
foreach ( $map as $search => $value )
{
  if (stripos($result, $search) !== false )
  {
    return call_user_func($value);
  }
}

在我的示例中,这些可以只是常量,我们可以 return 它们而不是应用函数。在功能模式中,这类似于 Scheme SRFI-1 中的函数 any,除了它 returns 它是真实值:

// This function uses PHP 5.6 ellipsis
function array_any(callable $callable, ...$arrays) {
  if( count($arrays) == 1 ) {
      $args_zipped = array_map( function ($x) { return [$x]; }, $arrays[0]);
  } else {
      array_unshift( $arrays, null);
      $args_zipped = call_user_func_array( "array_map", $arrays);
  }
  foreach ( $args_zipped as $args ) {
    $result = call_user_func_array($callable, $args);
    if( $result !== false )
      return $result;
  }
  return false;
}

array_any( function ($search, $value) { 
               if ( stripos($result, $search) !== false )
                   return $value;
                   return false;
           },
           array_keys($map),
           array_values($map));

该函数本身使用线性更新,但如您所见,它的工作方式类似于 array_map