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 检查。但是,这显然不支持多维数组。为了支持多维数组,必须在函数中添加更多参数,以预期数组预期具有的维数。这两个功能中的任何一个都可以工作:

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');

另一个问题,现在我们手头有很多函数,每个数组深度都有一个。我们如何做到这一点,以便可以为函数提供任何深度的数组?

4

1 回答 1

1

最终解决方案的工作原理类似于第二个数组:

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 回答