Задать вопрос
@Spizhen

PHP. поиск по слову?

Доброго времени суток.
Проблема такая, есть массив слов, в котором мне нужно найти слова с определенным началом или концом. Это я реализовал. Дальше появилась необходимость третьего параметра - это поиск в середине слова, какого то набора букв. Это мне тоже удалось сделать. Но не могу сделать так, чтобы последний параметр был необязательным.

Вот цикл, перебирающий массив слов.
//$viewFile - массив слов
//$starting - начало
//$ending - конец
//$middle - в центре
//$*Chars - количество символов

for ($i = $start ; $i <= $amount && $currentCount < $step; $i++) {
        $str = trim($viewFile[$i]); //обрезаем пробелы
        $haystack = strlen($str);   //считаем количество символов в слове

        if ($str != "" && strcasecmp(substr($str, 0, $startingChars), $starting) == 0 && strcasecmp(mb_substr($str, $haystack - $endingChars), $ending) == 0 && stripos($str, $middle) ) {
            $currentCount++;
            echo '<span class="badge">' . ($currentCount+$curr) . '</span> ';
            echo $viewFile[$i];
            echo '<br>';
        }
    }


В общем этот код выдает результат, только если задан $middle. Как сделать так, чтобы при $middle = '' поиск шел только по первым двум параметрам?
  • Вопрос задан
  • 482 просмотра
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@Spizhen Автор вопроса
В общем выкрутился из ситуации так.
for ($i = $start ; $i <= $amount && $currentCount < $step; $i++) {
        $str = trim($viewFile[$i]); //обрезаем пробелы
        $haystack = strlen($str);   //считаем количество символов в слове

        if ($middleChars != "" ){
            if ($str != "" && strcasecmp(substr($str, 0, $startingChars), $starting) == 0 && strcasecmp(mb_substr($str, $haystack - $endingChars), $ending) == 0 && stripos($str, $middle) )
            {
                $currentCount++;
                echo '<span class="badge">' . ($currentCount+$curr) . '</span> ';
                echo $viewFile[$i];
                echo '<br>';
            }
        }
        else
        {
           if ($str != "" && strcasecmp(substr($str, 0, $startingChars), $starting) == 0 && strcasecmp(mb_substr($str, $haystack - $endingChars), $ending) == 0 )
            {
                $currentCount++;
                echo '<span class="badge">' . ($currentCount+$curr) . '</span> ';
                echo $viewFile[$i];
                echo '<br>';
            } 
        }
    }


Всем спасибо =)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
$b = $str != "" && strcasecmp(substr($str, 0, $startingChars), $starting) == 0 && strcasecmp(mb_substr($str, $haystack - $endingChars), $ending) == 0;
if ($middle != "") $b = $b && stripos($str, $middle);
Ответ написан
valerium
@valerium
Изобретая велосипед
А почему бы не использовать регулярные выражения?

Я так понял, нужна функция, которой передаются пять параметров, один из которых не обязателен. Тогда можно оформить так.

function my_compare($haystack, $needle, $begin, $end, $middle = false) {
    // Используем "ленивую" особенность проверки условий в PHP
    $begin && $regexp[] = "$needle.+";
    $end && $regexp[] = ".+$needle";
    $middle && $regexp[] = ".+$needle.+";

    $result = array();
    foreach $regexp as $pattern {
        $result = array_merge($result, preg_grep($pattern, $haystack));
    }

    return $result;
}


В деле не проверял, может содержать синтаксические ошибки. Но мысль, надеюсь, передал.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽