如何为PHP函数提供一个可能不在任何深度设置的多维数组,并检查它是否';s设置在函数内部。(教程)
问题解释 PHP函数通常按以下方式调用:如何为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(
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']是否在内部设置