我有一个递归函数,通过索引在多维关联数组中搜索对象。
$settings = array(
'title' => new XCPreferenceShortText('title'),
'html' => new XCPreferenceLongText('html'),
'_blog' => array(
'_blog' => new XCPreferenceHeading('blog'),
'acceptcomments' => new XCPreferenceBoolean('acceptcomments'),
'per_page' => new XCPreferenceNumberSet('per_page')
),
'_publishing' => array(
'_publishing' => new XCPreferenceHeading('publishing'),
'published' => new XCPreferenceBoolean('published'),
'publishon' => new XCPreferenceDate('publishon'),
)
);
代码遍历数组,只要is_array($value)
返回true,就会递归整个事件。
function &find($idx, $pref_array = false) {
if ($pref_array === false)
$pref_array = &$this->preferences;
foreach ($pref_array as $key => $data) {
if (is_array($data)) {
$res = $this->find($idx, $data);
if ($res !== false)
return $res;
}
else if ($key == $idx)
return $pref_array[$idx];
}
return false;
}
此函数查找(并返回对结果的引用)与给定键关联的对象 - 但是当我将返回值/引用存储在变量中并将该var设置为null时,这对实际元素没有影响在“原始”阵列中。
答案 0 :(得分:1)
你必须像这样调用这个函数:
$value = &find($idx);
$value = null;
//just to be safe, in case you re-use $value later on
unset($value);
说通过引用返回的函数不足以在调用时创建存储引用。
顺便说一句,您应该知道名为RecursiveArrayIterator
的迭代器存在。
答案 1 :(得分:0)
我改进了Artefacto建议的函数调用 - 但该函数仍未返回仅通过递归检索的元素的引用。
在这种情况下,错误是递归调用本身。下面你会找到适合我的调整版本:
foreach ($pref_array as $key => $data) {
if (is_array($data)) {
$res = &$this->find($idx, &$pref_array[$key]);
if ($res !== false)
return $res;
}
else if ($key == $idx) {
return $pref_array[$idx];
}
}
之前调用&$this->find($idx, $data);
错误,因为$data
实际上没有参考。为了获得对数组的引用,我只需从引用的变量($pref_array
)中获取数组。
非常感谢你们。