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
。
我正在 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
。