将PHP中的嵌套对象转换为数组

时间:2018-10-23 07:29:43

标签: php arrays object type-conversion

我最近遇到了一个问题,我不得不将充当模型(强制数据类型等)的对象转换为数组以进行进一步处理。至少必须出现公共和私人财产。

考虑到堆栈溢出,我找到了各种方法来执行此操作,但是大多数方法仅适用于单个维(无嵌套模型),而多维版本始终将完整的模型名称保留在数组键中。

如何在保持代码干净的同时完成此任务?

编辑:由于有人将其标记为重复,所以并非如此。链接为重复的2个问题(我什至提到了我自己的问题)与它们不适用于多维对象或保留数组键(包括类名前缀为属性名)不同。我已经在搜索中测试了这两种解决方案,也没有完全按照我的描述进行。

1 个答案:

答案 0 :(得分:1)

受给定答案over here的启发,我对此进行了一些更改,因此不再获得名称前缀,然后将其更改为可以在对象内部使用的特征。然后可以使用$object->toArray();调用该实例。假定当前对象为默认对象,但是可以传递另一个实例。

从对象内部使用时,所有私有属性也将在数组中返回。

trait Arrayable
{
    public function toArray($obj = null)
    {
        if (is_null($obj)) {
            $obj = $this;
        }
        $orig_obj = $obj;

        // We want to preserve the object name to the array
        // So we get the object name in case it is an object before we convert to an array (which we lose the object name)
        if (is_object($obj)) {
            $obj = (array)$obj;
        }

        // If obj is now an array, we do a recursion
        // If obj is not, just return the value
        if (is_array($obj)) {
            $new = [];
            //initiate the recursion
            foreach ($obj as $key => $val) {
                // Remove full class name from the key
                $key = str_replace(get_class($orig_obj), '', $key);
                // We don't want those * infront of our keys due to protected methods
                $new[$key] = self::toArray($val);
            }
        } else {
            $new = $obj;
        }

        return $new;
    }
}