Intereting Posts
как подсчитать совпадающие ключевые слова, используя select в mysql codeigniter php? МетодNotAllowedHttpException в строке RouteCollection.php 218: 4 Что должен знать каждый программист PHP? Ошибка анализа: синтаксическая ошибка, неожиданный ';' Yii изменить класс ошибкиHandler в config / main.php XML-разбиение на страницы с помощью PHP Как работает RecursiveIteratorIterator в PHP? Одна установка PHP с несколькими файлами php.ini Несколько файлов javascript / css: лучшие практики? Можете ли вы добавить строки в удаленный файл, используя ftp_put () или что-то подобное? Javascript, создающий имя пользователя с использованием входов Как я могу заставить php возвратить 500, столкнувшись с фатальным исключением? Отправка нескольких вложений по электронной почте с помощью PHP NetBeans неправильно сохраняет код (все в одной строке с квадратами, где должны быть разрывы строк) Javascript API отлично работает на главном сайте, но не работает на внешнем сервере

Оператор switch возвращает неверные результаты

Гало! Я не уверен, где я ошибаюсь в своем заявлении о переключении! Вот что я хочу сделать для моего кода:

Если все три переменных пусты, то я ничего не хочу. Однако, если нет, то я хочу посмотреть, какие из них пусты, а какие нет, и выполняют разные задачи на основе их состояния.

Если они не пусты, я хочу добавить строку перед переменной. Если они пусты, я хочу добавить строку с сообщением «.. ПОЖАЛУЙСТА, ПРЕДОСТАВЛЯЙТЕ ИНФОРМАЦИЮ».

С текущими жестко закодированными переменными он должен возвращать:

Airline Name: United Flight Number: 262 Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT 

но он возвращает:

 Airline Name: PLEASE PROVIDE AIRLINE NAME Flight Number: PLEASE PROVIDE FLIGHT NUMBER Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT 

Код:

 $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if ($one =="" && $two =="" && $three =="") { } else { switch(true) { case !empty($one): $one = "Airline Name: $one<br>"; case empty($one): $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; case !empty($two): $two = "Flight Number: $two<br>"; case empty($two): $two = "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>"; case !empty($three): $three = "Departure Airport: $three<br>"; case empty($three): $three = "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>"; } } echo $one, $two, $three; } airport($airline_name,$flight_number,$departure_airport); ?> Рейс $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if ($one =="" && $two =="" && $three =="") { } else { switch(true) { case !empty($one): $one = "Airline Name: $one<br>"; case empty($one): $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; case !empty($two): $two = "Flight Number: $two<br>"; case empty($two): $two = "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>"; case !empty($three): $three = "Departure Airport: $three<br>"; case empty($three): $three = "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>"; } } echo $one, $two, $three; } airport($airline_name,$flight_number,$departure_airport); ?> 

Поведение, которое вы хотите, будет достигнуто с помощью if else или trernary operator (что в значительной степени представляет собой короткий способ записи if/else ). Вот грубый непроверенный пример.

 function airport($one, $two, $three) { if ( !empty($one) || !empty($two) || !empty($three) ) { $one = !empty($one) ? "Airline Name: $one<br>" :"Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; $two = !empty($two) ? "Flight Number: $two<br>" : "Flight Number: PLEASE PROVIDE FLIGHT NUMBER<br>"; $three = !empty($three) ? "Departure Airport: $three<br>" : "Departure Airport: PLEASE PROVIDE DEPARTURE AIRPORT<br>"; } echo $one, $two, $three; } airport($airline_name,$flight_number,$departure_airport); 

Что касается того, почему ваш switch не работает, как вы ожидаете, в руководстве:

Только когда оператор case найден со значением, которое соответствует значению выражения switch, PHP начинает выполнять инструкции. PHP продолжает выполнять инструкции до конца блока коммутатора или в первый раз, когда видит оператор break. Если вы не напишете оператор break в конце списка операторов case, PHP продолжит выполнение утверждений следующего случая.

http://php.net/manual/en/control-structures.switch.php

Здесь есть два вопроса. Во-первых, как указано в комментариях, у вашего оператора switch нет break s.

Во-вторых, оператор switch может иметь только 1 результат. Итак, как только он найдет свое первое совпадение, которое произойдет, когда $ one будет пустым или не будет пустым, это закончит утверждение.

В этом случае я бы просто использовал ряд, if вместо этого:

  <?php $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if(!empty($one)){ $one = "Airline Name: $one<br>"; } else { $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; } if(!empty($two)){ $two = "Flight Number: $two<br>"; } else { $two = "Flight Number: PLEASE PROVIDE AIRLINE NAME<br>"; } if(!empty($three)){ $three = "Departure Airport: $three<br>"; } else { $three = "Departure Airport: PLEASE PROVIDE AIRLINE NAME<br>"; } echo $one, $two, $three; } airport($airline_name,$flight_number,$departure_airport); ?> Рейс  <?php $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if(!empty($one)){ $one = "Airline Name: $one<br>"; } else { $one = "Airline Name: PLEASE PROVIDE AIRLINE NAME<br>"; } if(!empty($two)){ $two = "Flight Number: $two<br>"; } else { $two = "Flight Number: PLEASE PROVIDE AIRLINE NAME<br>"; } if(!empty($three)){ $three = "Departure Airport: $three<br>"; } else { $three = "Departure Airport: PLEASE PROVIDE AIRLINE NAME<br>"; } echo $one, $two, $three; } airport($airline_name,$flight_number,$departure_airport); ?> 

РЕДАКТИРОВАТЬ В ответ на ваш комментарий, возьмите этот простой пример здесь, если вы запустите его, вы увидите, что код только echos «первым», хотя все три случая одинаковы.

 <?php $a = 1; switch ($a) { case 1: echo 'first'; break; case 1: echo 'second'; break; case 1: echo 'third'; break; } ?> 

Ваш синтаксис неверен. Операторы switch выглядят следующим образом …

 switch ($some_var) { case 'Peter': // if $some_var has value 'Peter' # code... // this line executes if it is true, else breaks and loops through other cases until it finds right val break; default: # code... // default code to be executed if case val isn't found break; } 

И один вопрос? Почему вы используете boolean для переключения значений?

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

сначала поместите значение по умолчанию как пустое

 <?php $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if ($one =="" && $two =="" && $three =="") { } else { if ($one == '') $one= "PLEASE PROVIDE AIRLINE NAME<br>"; if ($two == '') $two= "PLEASE PROVIDE FLIGHT NUMBER<br>"; if ($three == '') $three = "PLEASE PROVIDE DEPARTURE AIRPORT<br>"; $x1= "Airline Name: ".$one; $x2= "Flight Number: ".$two; $x3= "Departure Airport:".$three; } echo $x1, $x2, $x3; } airport($airline_name,$flight_number,$departure_airport); ?> Рейс <?php $airline_name = "United"; $flight_number = 262; $departure_airport = ""; function airport($one, $two, $three) { if ($one =="" && $two =="" && $three =="") { } else { if ($one == '') $one= "PLEASE PROVIDE AIRLINE NAME<br>"; if ($two == '') $two= "PLEASE PROVIDE FLIGHT NUMBER<br>"; if ($three == '') $three = "PLEASE PROVIDE DEPARTURE AIRPORT<br>"; $x1= "Airline Name: ".$one; $x2= "Flight Number: ".$two; $x3= "Departure Airport:".$three; } echo $x1, $x2, $x3; } airport($airline_name,$flight_number,$departure_airport); ?>