PHP: проверьте, существует ли переменная, но также имеет значение, равное чему-то

У меня есть (или нет) переменная $_GET['myvar'] исходящая из моей строки запроса, и я хочу проверить, существует ли эта переменная, а также если значение соответствует чему-то внутри моего оператора if:

То, что я делаю и думаю, это не лучший способ сделать:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something') : сделать что-то

Мой вопрос: существует ли способ сделать это без объявления переменной дважды?

Это простой случай, но представьте себе, что нужно сравнить многие из этих переменных $myvar .

К сожалению, это единственный способ сделать это. Но есть подходы к работе с большими массивами. Например, что-то вроде этого:

 $required = array('myvar', 'foo', 'bar', 'baz'); $missing = array_diff($required, array_keys($_GET)); 

Теперь переменная $ missing содержит список значений, которые требуются, но отсутствуют в массиве $ _GET. Вы можете использовать $ missing array для отображения сообщения посетителю.

Или вы можете использовать что-то вроде этого:

 $required = array('myvar', 'foo', 'bar', 'baz'); $missing = array_diff($required, array_keys($_GET)); foreach($missing as $m ) { $_GET[$m] = null; } 

Теперь каждый требуемый элемент имеет по умолчанию значение по умолчанию. Теперь вы можете использовать if ($ _ GET ['myvar'] == 'something'), не беспокоясь о том, что ключ не установлен.

Обновить

Другим способом очистки кода будет использование функции, которая проверяет, установлено ли значение.

 function getValue($key) { if (!isset($_GET[$key])) { return false; } return $_GET[$key]; } if (getValue('myvar') == 'something') { // Do something } 

Если вы ищете однострочный, чтобы проверить значение переменной, которую вы еще не уверены, это работает:

 if ((isset($variable) ? $variable : null) == $value) { } 

Единственный возможный недостаток заключается в том, что если вы тестируете true / falsenull будет интерпретироваться как равное false .

Как подскажите, вы можете рассмотреть этот подход:

 required = array('myvar' => "defaultValue1", 'foo' => "value2", 'bar' => "value3", 'baz' => "value4"); $missing = array_diff($required, array_keys($_GET)); foreach($missing as $key => $default ) { $_GET[$key] = $default ; } 

Вы устанавливаете значения по умолчанию и устанавливаете не получаемые параметры в значение по умолчанию 🙂

Мой вопрос: существует ли способ сделать это без объявления переменной дважды?

Нет, нет способа сделать это правильно, не выполняя две проверки. Я тоже это ненавижу.

Один из способов обойти это – это импортировать все соответствующие переменные GET в одну центральную точку в массив или объект определенного типа (большинство из них MVC делают это автоматически) и устанавливают все свойства, которые необходимы позже. (Вместо доступа к переменным запроса через код.)

Благодаря Mellowsoon и Pekka, я сделал некоторые исследования здесь и придумал это:

  • Проверяйте и объявляйте каждую переменную как null (если это так) перед началом использования (как рекомендовано):
 ! isset ($ _ GET ['myvar'])?  $ _GET ['myvar'] = 0: 0;

* ok, это просто, но отлично работает, вы можете начать использовать переменную всюду после этой строки

  • Использование массива для всех случаев:
 $ myvars = array ('var1', 'var2', 'var3');
 foreach ($ myvars как $ key)
     ! isset ($ _ GET [$ key])?  $ _GET [$ key] = 0: 0;

* после этого вы можете использовать свои переменные (var1, var2, var3 … и т. д.),

PS: функция, получающая объект JSON, должна быть лучше (или простая строка с разделителем для взрыва / взрыва);

… Лучшие подходы приветствуются 🙂


ОБНОВИТЬ:

Используйте $ _REQUEST вместо $ _GET, таким образом вы покрываете переменные $ _GET и $ _POST.

 ! isset ($ _ REQUEST [$ key])?  $ _REQUEST [$ key] = 0: 0;

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

 function _FX($name) { if (isset($$name)) return $$name; else return null; } 

то вы делаете _FX('param') == '123' , просто мысль

Я использую всю свою собственную полезную функцию exst (), которая автоматически объявляет переменные.

Пример –

 $element1 = exst($arr["key1"]); $val2 = exst($_POST["key2"], 'novalue'); /** * Function exst() - Checks if the variable has been set * (copy/paste it in any place of your code) * * If the variable is set and not empty returns the variable (no transformation) * If the variable is not set or empty, returns the $default value * * @param mixed $var * @param mixed $default * * @return mixed */ function exst( & $var, $default = "") { $t = ""; if ( !isset($var) || !$var ) { if (isset($default) && $default != "") $t = $default; } else { $t = $var; } if (is_string($t)) $t = trim($t); return $t; } 

Решение, которое я нашел от игры, это сделать:

 if($x=&$_GET["myvar"] == "something") { // do stuff with $x } 
 <?php function myset(&$var,$value=false){ if(isset($var)): return $var == $value ? $value : false; endif; return false; } $array['key'] = 'foo'; var_dump(myset($array['key'],'bar')); //bool(false) var_dump(myset($array['key'],'foo'));//string(3) "foo" var_dump(myset($array['baz'],'bar'));//bool(false) 

Это похоже на принятый ответ, но вместо этого использует in_array . Я предпочитаю использовать empty() в этой ситуации. Я также предлагаю использовать новое объявление строкового массива, которое доступно в PHP 5.4.0 +.

 $allowed = ["something","nothing"]; if(!empty($_GET['myvar']) && in_array($_GET['myvar'],$allowed)){..} 

Вот функция для проверки сразу нескольких значений.

 $arrKeys = array_keys($_GET); $allowed = ["something","nothing"]; function checkGet($arrKeys,$allowed) { foreach($arrKeys as $key ) { if(in_array($_GET[$key],$allowed)) { $values[$key]; } } return $values; } 

Ну, вы можете обойтись, только if($_GET['myvar'] == 'something') поскольку это условие предполагает, что переменная также существует. Если это не так, выражение также приведет к false .

Я думаю, что это нормально делать в условных выражениях, как указано выше. На самом деле никакого вреда.

Никакой официальной ссылки, но она работала, когда я пробовал это:

 if (isset($_GET['myvar']) == 'something')