我最近遇到了一个问题,我不得不将充当模型(强制数据类型等)的对象转换为数组以进行进一步处理。至少必须出现公共和私人财产。
考虑到堆栈溢出,我找到了各种方法来执行此操作,但是大多数方法仅适用于单个维(无嵌套模型),而多维版本始终将完整的模型名称保留在数组键中。
如何在保持代码干净的同时完成此任务?
编辑:由于有人将其标记为重复,所以并非如此。链接为重复的2个问题(我什至提到了我自己的问题)与它们不适用于多维对象或保留数组键(包括类名前缀为属性名)不同。我已经在搜索中测试了这两种解决方案,也没有完全按照我的描述进行。
答案 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;
}
}