【问题标题】:PHP recursively turning an ArrayObject to an Associative ArrayPHP递归地将ArrayObject转换为关联数组
【发布时间】:2013-04-18 18:18:45
【问题描述】:

大家好,我有一个方法应该回调并递归地将 Arrayobject 转换为关联数组,不幸的是我遇到了一个致命错误

PHP Fatal error:  Call to undefined method ArrayObject::toArray()

这是我的方法

/**
 * Take an ArrayObject and recursively turn it into an array
 * 
 * @param bool $recursion
 * 
 * @return array
 */
public function toArray($recursion = false) 
{
    // just in case the object might be multidimensional
    if (true === $this->object) return $this->object->getArrayCopy();

    return array_map( function($item)
    {
        return is_object($item) ? $item->toArray(true) : $item;

    }, $this->object->getArrayCopy() );
}

这是一个示例ArrayObject

ArrayObject Object
(
    [storage:ArrayObject:private] => Array
        (
            [profile] => ArrayObject Object
                (
                    [storage:ArrayObject:private] => Array
                        (
                            [list] => ArrayObject Object
                                (
                                    [storage:ArrayObject:private] => Array
                                        (
                                            [location] => 
                                            [network_name] => 
                                            [interests] => 
                                            [last_name] => 
                                            [url] => 
                                            [significant_other] => 
                                            [network_domains] => 
                                            [contact] => ArrayObject Object
                                                (
                                                    [storage:ArrayObject:private] => Array
                                                        (
                                                            [im] => ArrayObject Object
                                                                (
                                                                    [storage:ArrayObject:private] => Array
                                                                        (
                                                                            [provider] => 
                                                                        )

                                                                )

                                                            [email_addresses] => 
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [messages] => ArrayObject Object
                (
                    [storage:ArrayObject:private] => Array
                        (
                            [list] => Array
                                (
                                    [0] => foo
                                    [1] => bar
                                    [2] => baz
                                )

                        )

                )

            [groups] => ArrayObject Object
                (
                    [storage:ArrayObject:private] => Array
                        (
                        )

                )

            [users] => ArrayObject Object
                (
                    [storage:ArrayObject:private] => Array
                        (
                        )

                )

        )

)

【问题讨论】:

  • 在哪里以及如何调用函数 toArray 函数。
  • 在另一个类中,我正在实例化我的解析器,解析输入,将该值分配给$this->object,然后运行$foo = $bar->toArray()。实例化和利用公共方法调用的典型方式。
  • 尝试将函数名replace toArray() 更改为其他。第二件事是,作为错误,您正在创建解析器的对象。您正在通过数组对象调用函数。重新检查您的代码。
  • 创建回调的目的是让它递归,将回调的名称更改为getArrayCopy()。使用getArrayCopy() 而不是$this->toArray() 会破坏递归功能,并且只对对象的顶层进行操作。
  • 不要使用 getArrayCopy() 名称。我是说用任何其他名称替换。

标签: php oop recursion callback arrayobject


【解决方案1】:

这可以正常工作,通过将$this 作为变量传递,我无需担心与$this->object 发生冲突或范围问题。

/**
 * Public wrapper for Protected getArray()
 * 
 * @return arrau
 */
public function toArray()
{
    return $this->getArray($this->object);
}

/**
 * Take an ArrayObject and turn it into an associative array
 * 
 * @param ArrayObject $obj
 * 
 * @return array
 */
protected function getArray($obj) 
{
    $array  = array(); // noisy $array does not exist
    $arrObj = is_object($obj) ? get_object_vars($obj) : $obj;
    foreach ($arrObj as $key => $val) {
            $val = (is_array($val) || is_object($val)) ? $this->getArray($val) : $val;
            $array[$key] = $val;
    }
    return $array;
}

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多