web-dev-qa-db-ja.com

PHP:変数が存在するかどうかを確認します

私はクエリ文字列からの変数_$_GET['myvar']_を持っている(または持っていない)ので、この変数が存在するかどうか、またifステートメント内の値に対応する値があるかどうかを確認したい:

私がやっていると思うことは、最善の方法ではありません:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something'):何かをする

私の質問は、変数を2回宣言せずにこれを行う方法はありますか?

これは単純なケースですが、この_$myvar_変数の多くを比較する必要があると想像してください。

35
Mariz Melo

残念ながらそれが唯一の方法です。しかし、より大きな配列を扱うためのアプローチがあります。たとえば、次のようなものです。

$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'] == 'something')を使用できるようになりました。

更新

コードをクリーンアップするもう1つの方法は、値が設定されているかどうかをチェックする関数を使用することです。

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

if (getValue('myvar') == 'something') {
    // Do something
}
18
mellowsoon

まだ設定されているかどうかわからない変数の値を確認するためのワンライナーを探している場合、これは機能します:

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

唯一の欠点は、true/falseをテストしている場合、nullfalseと等しいと解釈されることです。

12

PHP7以降では、 Null Coalescing Operator??二重参照を回避するには:

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

出力:

hello!

一般的に、式

$a ?? $b

に等しい

isset($a) ? $a : $b
3
Nick

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

デフォルト値を設定し、未受信パラメーターをデフォルト値に設定します:)

1
Victor

常に変数を自動的に宣言する便利な関数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
user2253362

MellowsoonとPekkaに感謝します、私はここでいくつかの研究をして、これを思いつきました:

  • 使用を開始する前に(推奨される場合)、各変数をnull(該当する場合)としてチェックして宣言します。
!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オブジェクトを受け取る関数のほうが優れている(または、爆発/爆発するための区切り文字付きの単純な文字列)

...より良いアプローチを歓迎します:)


更新:

$ _GETの代わりに$ _REQUESTを使用して、$ _ GET変数と$ _POST変数の両方をカバーします。

!isset($ _ REQUEST [$ key])? $ _REQUEST [$ key] = 0:0; 
0
Mariz Melo
<?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
keithics

私の質問は、変数を2回宣言せずにこれを行う方法はありますか?

いいえ、2つのチェックを行わずにこれを正しく行う方法はありません。 私も嫌いです

これを回避する1つの方法は、関連するすべてのGET変数を1つの中心点で配列または何らかのオブジェクトにインポートし(ほとんどのMVCフレームワークがこれを自動的に行う)、後で必要なすべてのプロパティを設定することです。 (コード全体でリクエスト変数にアクセスする代わりに。)

0
Pekka 웃

私が遊んでから発見した解決策は次のとおりです:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
0
Sheldon Juncker

これは受け入れられた答えに似ていますが、代わりに_in_array_を使用します。この状況ではempty()を使用することを好みます。また、 PHP 5.4. +で利用可能な新しい略式配列宣言を使用することをお勧めします。

_$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
EternalHour

これを行うための関数を作成して、チェックしたい変数を実際の変数に変換してください。

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

その後、あなたは_FX('param') == '123'を行います、ただの考え

0
windmaomao