Используйте stristr для сопоставления любого значения в массиве в ОДНОМ условии, если без нескольких операторов - PullRequest
2 голосов
/ 12 декабря 2011

Я вполне способен при кодировании PHP, хотя я только что столкнулся с ситуацией, когда я задавался вопросом, можно ли использовать stristr для сопоставления с любым значением в массиве внутри условия SINGLE if.Мне не нужен / не нужен класс, выделенная функция или что-то сверхсложное, и я не делаю ничего сложного, например, пытаюсь сопоставить специальные символы, я просто думаю, что, возможно, пропустил что-то полезное на php.net.

Общее понятие ...

if (stristr($search_this,$array_with_values)) {echo 'a match was found';}

... или что будет (даже если это не работает) ...

if (stristr($search_this,array('string1','string2'))) {echo 'a match was found';}

... Iможет попытаться найти строки 'apple', 'orange', 'banana' в обычном предложении / строке.

Я могу определить массив вне условия if.

Моя основная цельэто просто не иметь многочисленные условия или использовать несколько операторов, таких как && или ||.

Так что я не хочу иметь несколько ||операторы, подобные этому, если это возможно ...

if (
stristr($search_this_string,'string1') || 
stristr($search_this_string,'string2') || 
stristr($search_this_string,'string3')
) {echo 'a match was found';}

Я не против иметь массив перед / вне условия if, хотя я хочу иметь возможность помещать все остальное внутри одного условия if.

Ответы [ 4 ]

7 голосов
/ 12 декабря 2011

Регулярное выражение определенно подойдет для этого. Очень короткий, и я ожидаю, что быстрее, чем что-либо, даже отдаленно близкое к длине.

if(preg_match('/'.implode('|', array_map('preg_quote', $needles)).'/i', $haystack)) {
    echo 'Match found!';
}

Редактировать: Относительно "stristr", присутствующего в заголовке вопроса ... сосредоточиться на проблеме , а не на решении.

5 голосов
/ 12 декабря 2011

Я сомневаюсь, что это эффективно, но если вы ищете достаточно простую однострочку:

if( str_ireplace(array('string1', 'string2'), '', $str) != $str )
{
  echo 'a match was found';
}
1 голос
/ 12 декабря 2011

Эта функция будет делать то, что вы хотите, если это приемлемый подход:

function substr_in_array ($str, $array, $caseSensitive = FALSE) {
  if ($caseSensitive) {
    foreach ($array as $value) if (strpos($value, $str) !== FALSE) return TRUE;
  } else {
    foreach ($array as $value) if (stripos($value, $str) !== FALSE) return TRUE;
  }
  return FALSE;
}

if (substr_in_array($search_this, $array_with_values)) {
  echo 'a match was found';
}

В качестве примечания, вы, похоже, используете strstr() для обнаружения , если aсуществует substr, для которого вы должны использовать strpos() (то же самое относится к stristr() и stripos())

1 голос
/ 12 декабря 2011

Вы можете использовать обходную конструкцию:

 if (array_filter(array_map("stristr", array_fill(0, count($array), $sentence), $array))) {

, которая будет применяться stristr к каждому элементу.array_filter сохранит только установленные элементы, поэтому логическое условие может совпадать (массив с элементами) или не выполняться (пустой массив).

Редактировать : ОКНе так просто.Вам необходим вспомогательный список (array_fill с исходным текстом), поскольку для использования stristr требуется два параметра из array_map.

Обратите внимание, что вы отказываетесь от оценки короткого замыкания с этим.И несмотря на распространенные мифы, было бы быстрее просто использовать preg_match для таких случаев (возможно, даже меньше кода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...