PHP: проверьте, существует ли переменная, но также имеет значение, равное чему-то
У меня есть (или нет) переменная $_GET['myvar']
, исходящая из моей строки запроса, и я хочу проверить, существует ли эта переменная, а также если значение соответствует чему-то внутри оператора if:
Что я делаю и думаю, это не лучший способ:
if(isset($_GET['myvar']) && $_GET['myvar'] == 'something')
: сделать что-то
Мой вопрос: существует ли способ сделать это без объявления переменной дважды?
Это простой случай, но представьте себе, что нужно сравнить многие из этих переменных $myvar
.
Ответы
Ответ 1
К сожалению, это единственный способ сделать это. Но есть подходы к работе с большими массивами. Например, что-то вроде этого:
$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
}
Ответ 2
Если вы ищете однострочный, чтобы проверить значение переменной, которую вы еще не уверены, это работает:
if ((isset($variable) ? $variable : null) == $value) { }
Единственный возможный недостаток заключается в том, что если вы тестируете для true
/false
- null
, будет считаться равным false
.
Ответ 3
Как подскажите, вы можете рассмотреть этот подход:
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 ;
}
По умолчанию заданы значения по умолчанию и заданы значения, не получаемые по умолчанию:)
Ответ 4
Мой вопрос: существует ли способ сделать это без объявления переменной дважды?
Нет, нет способа сделать это правильно, не выполняя две проверки. Я тоже это ненавижу.
Один из способов обойти это - импортировать все соответствующие переменные GET в одну центральную точку в массив или объект какого-либо типа (большинство фреймворков MVC делают это автоматически) и устанавливают все свойства, которые необходимы позже. (Вместо доступа к переменным запроса через код.)
Ответ 5
Спасибо Mellowsoon и Pekka, я сделал некоторые исследования здесь и придумал это:
- Проверяйте и объявляйте каждую переменную как нуль (если это так) перед началом использования (как рекомендуется):
!isset($_GET['myvar']) ? $_GET['myvar'] = 0:0;
* ok, этот простой, но отлично работает, вы можете начать использовать переменную везде после этой строки
- Использование массива для всех случаев:
$myvars = array( 'var1', 'var2', 'var3');
foreach($myvars as $key)
!isset($_GET[$key]) ? $_GET[$key] =0:0;
* после этого вы можете использовать свои переменные (var1, var2, var3... и т.д.),
PS: функция, получающая объект JSON, должна быть лучше (или простая строка с разделителем для взрыва/взлома);
... Лучшие подходы приветствуются:)
UPDATE:
Используйте $_REQUEST вместо $_GET, таким образом вы покрываете переменные $_GET и $_POST.
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
Ответ 6
почему бы не создать функцию для этого, преобразовать переменную, которую вы хотите проверить, в реальную переменную, например.
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
тогда вы делаете _FX('param') == '123'
, просто мысль
Ответ 7
Я использую всю полезную функцию времени 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;
}
Ответ 8
Решение, которое я нашел от игры:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
Ответ 9
<?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)
Ответ 10
Это похоже на принятый ответ, но вместо этого использует 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;
}
Ответ 11
Ну, вы можете пройти с помощью if($_GET['myvar'] == 'something')
, поскольку это условие предполагает, что переменная также существует. Если это не так, выражение также приведет к false
.
Я думаю, что это нормально делать в условных выражениях, подобных выше. На самом деле никакого вреда не было.
Ответ 12
Нет официальных ссылок, но это сработало, когда я пробовал это:
if (isset($_GET['myvar']) == 'something')