PHP:通过关联数组中的引用删除对象

时间:2010-07-31 20:48:53

标签: php arrays

我有一个递归函数,通过索引在多维关联数组中搜索对象。

$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时,这对实际元素没有影响在“原始”阵列中。

2 个答案:

答案 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)中获取数组。

非常感谢你们。