作者: | 来源:互联网 | 2023-09-09 13:06
Iamcurlingonaspecificpagethatreturnsonlyhtml.Todeterminewhatpageitreturns,Isimply
I am curl
ing on a specific page that returns only html
. To determine what page it returns, I simply try to stripos
the result of the curl
我正在卷曲一个只返回html的特定页面。为了确定它返回的页面,我只是尝试去除curl的结果
Like so:
$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
}
}
This is quite messy I think, is there an OO way or functional way to solve this kind of problem if I were looking at minimal if
statements or ultimately an if-less
code.
我认为这是非常混乱的,如果我正在查看最小的if语句或最终的if-less代码,是否有一种OO方式或功能方式来解决这类问题。
2 个解决方案
What you are searching for a ways of abstraction. In this example you are repeating yourself in case analysis and this might be the best approach if the "do something" is very different and not consistent.
你正在寻找一种抽象方式。在这个例子中,你在案例分析中重复自己,如果“做某事”非常不同且不一致,这可能是最好的方法。
$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);
}
}
In my example these could just have been constants and we could just return them instead of applying a function. In a functional pattern this would be like the function any
in Scheme SRFI-1 except it returns it's true value:
在我的例子中,这些可能只是常量,我们可以返回它们而不是应用函数。在函数模式中,这将类似于Scheme SRFI-1中的函数,除了它返回它的真值:
// 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));
The function in itself uses linear update, but as you can see it works similar to array_map
.
该函数本身使用线性更新,但正如您所见,它的工作方式类似于array_map。