我在PHP中有一个带有大数组的文件和一个搜索数组的函数。
下面是代码:
$details = array(
array('fieldID'=>'0','fieldCaption'=>'Address 1','fieldType'=>'text','fieldName'=>'addr1','fieldRequired'=>'1'),
array('fieldID'=>'1','fieldCaption'=>'Address 2','fieldType'=>'text','fieldName'=>'addr2','fieldRequired'=>'1'),
.
.
.
);
if(!function_exists('find_detail'))
{
function find_detail($fieldName)
{
global $details;
var_dump($details); // NULL
foreach ($details as $detail)
{
if($detail['fieldName'] == $fieldName)
{
return $detail['fieldID'];
}
}
return false;
}
}
这位于一个帮助文件中并调用var_dump($ details);正在返回NULL。我怀疑存在范围问题。
非常感谢
- 编辑 -
这是不好的做法,处理这个问题的最佳方法是(如@Gordon所说)将细节数组传递给函数。 (警告:存在更好的方法,例如使用array_filter)
if(!function_exists('find_detail_by_field_name'))
{
function find_detail_by_field_name($details, $fieldName)
{
foreach ($details as $detail)
{
if($detail['fieldName'] == $fieldName)
{
return $detail['fieldID'];
}
}
return false;
}
}
并提供一种获取细节的方法,在函数中包装细节将提供许多好处,如缓存,更改源等。
function get_details()
{
static $details = array(...)
return $details;
}
答案 0 :(得分:4)
为什么global
似乎不起作用的答案是CI的帮助文件包含在函数范围内。换句话说,$details
数组不在全局范围内,因此global
看不到它。
至于你应该怎么做 - 看看别人的答案。
答案 1 :(得分:1)
如果你的函数在$details
数组上运行,它应该在函数签名中询问该数组。其他任何东西只是隐藏依赖项,很难调试和维护(正如您可以看到需要提出问题)。所以把它改成
function find_detail($fieldName, array $details)
然后传递给传入的数组。
此外,由于该函数确实返回了fieldId而不是某些细节,因此您可能希望将其重命名为
function findFieldIdByFieldName($fieldName, array $details)
但是要回答你的问题:你可能会得到这种效果,因为你在全局范围之外创建了$ details数组,这是你脚本的最高范围。如果您在函数或方法中定义了$ details,或者它包含在另一个函数的范围内,则它不在全局范围内。
答案 2 :(得分:0)
此外,您可以考虑使用Config类代替global
。这样,您就拥有了一个静态数组变量,只要您需要它,只需使用助手中的CI超级对象$ci =& get_instance();
调用CI Config函数。