oop — OO или функциональный способ сравнения строк в Stack Overflow

я 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 код.

0

Решение

Что вы ищете способы абстракции. В этом примере вы повторяете себя в анализе кейсов, и это может быть лучшим подходом, если «сделать что-то» сильно отличается и не соответствует.

$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,

1

Другие решения

Эта простая функция сделает эту работу:

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','?'));

Это выведет: —

Привет был найден!
Хухуд не был найден
вверх был найден!
? был найден!
0

По вопросам рекламы [email protected]