Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为PHP函数提供一个可能不在任何深度设置的多维数组,并检查它是否';s设置在函数内部。(教程)_Php_Multidimensional Array_User Defined Functions_Isset - Fatal编程技术网

如何为PHP函数提供一个可能不在任何深度设置的多维数组,并检查它是否';s设置在函数内部。(教程)

如何为PHP函数提供一个可能不在任何深度设置的多维数组,并检查它是否';s设置在函数内部。(教程),php,multidimensional-array,user-defined-functions,isset,Php,Multidimensional Array,User Defined Functions,Isset,问题解释 PHP函数通常按以下方式调用: myFunction($parameter); 但如果未设置$parameter,PHP将抛出一个错误。解决这一问题的办法是如下所示: if (isset ($parameter)) { myFunction($parameter); } 但是,每次调用该函数时都必须使用if()检查,并且不确定是否已设置,这会让人非常恼火。我想到的第一件事是这样声明函数: function myFunction($local) { if(isset(

问题解释

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');
要查看变量如何工作,请参阅

在我需要检查数组索引之前,这一切都很正常。为了解决这个问题,我创建了一个不同的函数来处理一定要设置的数组:

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

另一个问题是,现在我们的手上满是函数,每个数组深度对应一个函数。我们如何使函数能够以任意深度馈入阵列?

最终解决方案的工作原理与第二个阵列类似:

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,有效地阻止我们继续进行检查

当我们完成循环时,我们返回状态,它可以是真的,也可以是假的

换句话说,运行以下命令:

deepIsset($parameter,array('foo','bar','baz'));
如果设置了$parameter['foo']['bar']['baz'],则返回TRUE

等等。。。所以基本上我们重新设计了isset()函数?对不过有一个关键的区别:它现在可以在函数内部使用。让我们回到原来的函数:

function myFunction($variable,$keys)
{
    if(deepIsset($variable,$keys))
    {
        //Code goes here.
    }
}
myFunction($parameter,array('foo','bar','baz'));
我们走了。现在,我们可以将原始函数与多维变量一起使用,同时在函数内部进行isset()检查:

function myFunction($variable,$keys)
{
    if(deepIsset($variable,$keys))
    {
        //Code goes here.
    }
}
myFunction($parameter,array('foo','bar','baz'));
这将为函数提供变量$parameter,并检查$parameter['foo']['bar']['baz']是否在内部设置