я curl
на определенной странице, которая возвращает только html
, Чтобы определить, какую страницу он возвращает, я просто пытаюсь 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
код.
Что вы ищете способы абстракции. В этом примере вы повторяете себя в анализе кейсов, и это может быть лучшим подходом, если «сделать что-то» сильно отличается и не соответствует.
$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);
}
}
В моем примере это могли быть только константы, и мы могли бы просто вернуть их вместо применения функции. В функциональном паттерне это будет похоже на функцию any
в схеме 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));
Функция сама по себе использует линейное обновление, но, как вы можете видеть, она работает аналогично array_map
,
Эта простая функция сделает эту работу:
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','?'));
Это выведет: —
Привет был найден! Хухуд не был найден вверх был найден! ? был найден!