PHP: Проверьте, существует ли переменная, но также имеет ли значение, равное чему-либо - PullRequest
33 голосов
/ 24 октября 2010

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

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

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

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

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

Ответы [ 13 ]

17 голосов
/ 24 октября 2010

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

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

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

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

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

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

Обновление

Еще одинспособ очистки кода будет использовать функцию, которая проверяет, установлено ли значение.

function getValue($key) {
    if (!isset($_GET[$key])) {
        return false;
    }
    return $_GET[$key];
}

if (getValue('myvar') == 'something') {
    // Do something
}
12 голосов
/ 18 августа 2016

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

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

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

2 голосов
/ 24 ноября 2018

Начиная с PHP7, вы можете использовать оператор объединения нулей ??, чтобы избежать двойной ссылки:

$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
    echo "hello!";
}

Вывод:

hello!

В общемвыражение

$a ?? $b

эквивалентно

isset($a) ? $a : $b
1 голос
/ 05 октября 2011

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

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  ;
}

Вы устанавливаете значения по умолчанию и устанавливаете для непринятых параметров значение по умолчанию:)

0 голосов
/ 11 ноября 2014

Это похоже на принятый ответ, но вместо него используется 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;
}
0 голосов
/ 14 марта 2014
<?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) 
0 голосов
/ 05 марта 2014

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

if (isset($_GET['myvar']) == 'something')
0 голосов
/ 14 декабря 2013

Решение, которое я нашел в процессе игры, заключается в следующем:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
0 голосов
/ 10 апреля 2013

Я все время использую собственную полезную функцию 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;
}
0 голосов
/ 24 августа 2011

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

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

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

...