0

問題の説明

通常、PHP 関数は次の方法で呼び出されます。

myFunction($parameter);

$parameter が設定されていない場合、PHP はエラーをスローします。それに対する解決策は、次のようにすることです。

if (isset ($parameter))
{
    myFunction($parameter);
}

ただし、その関数を呼び出すたびに if() チェックを使用する必要があり、それが設定されているかどうかわからないのは本当に面倒です。私が最初に考えたのは、関数を次のように宣言することでした。

function myFunction($local)
{
    if(isset($local))
    {
        //Code goes here.
    }
}

しかし、PHP は設定されていない変数をパラメーターとして関数に渡すことをサポートしていないようであるため、関数の呼び出しは機能しませんでした。これを回避するために、変数変数を使用しました。

function myFunction($local)
{
    if(isset(${$local})
    {
        //Code goes here.
    }
}

myFunction('parameter');

可変変数がどのように機能するかを確認するには、PHP マニュアルを参照してください。

配列インデックスをチェックする必要があるまで、これはうまく機能していました。これを解決するために、確実に設定される配列で機能する別の関数を作成しました。

myFunctionArray($array,$key)
{
    if(isset($array[$key]))
    {
        //Code goes here.
    }
}
$variable = array();
myFunctionArray($parameter,'key');

この場合、$variable が設定されており、'key' は無害な文字列であるため、$variable[$key] が設定されていなくてもエラーは発生せず、関数内で isset チェックを正常に実行できます。ただし、これは明らかに多次元配列をサポートしていません。多次元配列をサポートするには、配列に期待される次元数を見越して、関数にさらにパラメーターを追加する必要があります。次の 2 つの関数のいずれかが機能します。

myFunctionMultiArray($array,$key1,$key2,$key3)
{
    if(isset($array[$key1][$key2][$key3]))
    {
        //Code goes here.
    }
}
myFunctionMultiArray2($array,$keys)
{
    if(isset($array[$keys[0]][$keys[1]][$keys[2]]))
    {
        //Code goes here.
    }
}
$variable = array();
myFunctionMultiArray($parameter,'key1','key2','key3');
myFunctionMultiArray2($parameter,array('key1','key2','key3');

もう 1 つの問題は、配列の深さごとに 1 つの関数を用意することです。関数に任意の深さの配列を供給できるようにするにはどうすればよいでしょうか?

4

1 に答える 1

1

最終的な解決策は、2 番目の配列と同様に機能します。

function deepIsset($variable,$keys)
{
    $status = TRUE;
    foreach ($keys as $key)
    {
        if($status)
        {
            if (isset($variable[$key]))
            {
                $variable = $variable[$key];
            }
            else
            {
                $status = FALSE;
            }
        }
    }
    return $status;
}

まず、すべてが問題ないと仮定して、ローカル変数 $status を作成することから始めます。

次に、チェックしている配列のすべての深さのすべてのキーを含む配列の反復処理を開始します。

これまでエラーが発生していない場合は、チェックを続けます。変数[$key]は設定されていますか? もしそうなら、$variable[$key] を設定することで、その深さに入ります。そうでない場合は、$status を FALSE に設定して、チェックを継続することを効果的に停止します。

ループが終了したら、TRUE または FALSE のステータスを返します。

つまり、これを実行します。

deepIsset($parameter,array('foo','bar','baz'));

$parameter['foo']['bar']['baz'] が設定されている場合は TRUE を返します。

待ってください...つまり、基本的に isset() 関数を再発明したということですか? はい!ただし、重要な違いがあります。関数内で使用できるようになりました。元の関数に戻りましょう。

function myFunction($variable,$keys)
{
    if(deepIsset($variable,$keys))
    {
        //Code goes here.
    }
}

そして、そこに行きます。関数内で isset() チェックを行いながら、元の関数を多次元変数で使用できるようになりました。

myFunction($parameter,array('foo','bar','baz'));

これは、関数に変数 $parameter をフィードし、$parameter['foo']['bar']['baz'] が内部に設定されているかどうかをチェックします。

于 2013-01-30T21:31:16.287 に答える