@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 = '' поиск шел только по первым двум параметрам?
  • Вопрос задан
  • 463 просмотра
Решения вопроса 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;
}


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

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

Войти через центр авторизации
Похожие вопросы