PHP: оператор IF работает сам по себе, но не внутри цикла WHILE

#php #if-statement #while-loop #strtok

#php #if-statement #while-цикл #strtok

Вопрос:

Проблема:

Допустим, у меня есть $ keyword = предложение, введенное в поле поиска, например, «большие белые поля»

Что мне нужно сделать, это разбить это на отдельные слова, а затем протестировать каждое слово, чтобы убедиться, что * не появляется в первых 3 буквах. (Итак, sen * было бы нормально, но se * не было бы нормально). Если * действительно появляется в первых 3 буквах любого отдельного слова, то процесс «if ($keyword) …» должен завершиться.

 if ($keyword)  {


            $token = strtok($keyword, " ");
                while ($token != false) {
                    echo $token;
                        if (stripos($token,"*") < 3 ) {
                        return;
                        }
                    $token = strtok(" ");
                    }
  

…код продолжается…

Как вы можете видеть, я повторяю каждый раз, чтобы увидеть, как он обрабатывается.

Если я избавлюсь от кода ‘if’, то он выводит ‘largewhiteboxes’ и продолжает работу, как ожидалось.

Если я оставлю код ‘if’ как есть, выводится только ‘large’, и процедура завершается — даже если условие не было выполнено!

Если я запускаю этот оператор ‘if’ сам по себе, вне цикла WHILE, он работает просто отлично, отвечая true на * в первых 3 позициях и false для всего остального…

Что я могу с этим делать не так???

Ответ №1:

В документации есть гигантское красное предупреждение, на stripos которое вы должны обратить внимание.

Другими словами, вам нужно проверить, является ли возвращаемое значение !== false , прежде чем проверять, является ли оно < 3 .

Кроме того, почему вы беспокоитесь о том, strtok когда explode(',', $keyword) доступно?

Комментарии:

1. Спасибо… на самом деле, stripos уже был там и работал… однако он проверял первые 3 символа всей фразы, а не отдельные слова внутри фразы. Поскольку он работал без проблем, я действительно не изучал эту его часть (хотя сейчас я это сделаю). Моя проблема возникла при попытке поместить его внутри цикла WHILE. На самом деле я использовал explode в начале, но из-за сбоев в конечном итоге с strtok…

2. strtok на самом деле действительно умный. Если у вас действительно большая строка, вы не хотите разбивать ее всю сразу, и поскольку вам все равно нужно выполнять цикл, strtok довольно эффективен.

3. Что ж, хотел бы я быть таким же умным, как команда strtok, потому что тогда я бы с этим разобрался 😉 … Я пробую некоторые варианты, основанные на моментах, о которых упомянул Джон, но все еще безуспешно…

4. @FritsvanCampen: Конечно. Но вы дорого платите за это «преимущество» в простоте использования. Вам это действительно нужно?

Ответ №2:

Этот вариант, похоже, работает.

 $keyword = "large white boxes";

$token = strtok($keyword, " ");

while ($token !== false) {
    echo $token;
    $pos = stripos($token, "*");
    if ($pos < 3 amp;amp; $pos !== false) {
        return;
    }
    $token = strtok(" ");
}
  

Комментарии:

1. А Ш Е С О М Е. После первоначального тестирования это работает ;-), я, конечно, протестирую еще немного… Я включил !== false и начал формироваться в этом направлении… но, чувак, ты попал прямо в paint, окунул его!!! Спасибо всем за вклад в это, я действительно ценю это!