如何从嵌套对象构建嵌套数组?
问题描述:
例如,我有对象:如何从嵌套对象构建嵌套数组?
<?php
class A
{
public $key;
public $parent;
}
class B
{
public $value;
public $objects;
}
$a1 = new A();
$a1->key = 'a1';
$a2 = new A();
$a2->key = 'a2';
$a2->parent = $a1;
$a3 = new A();
$a3->key = 'a3';
$a3->parent = $a2;
$b = new B();
$b->objects = [$a1, $a2, $a3];
$b->value = 100;
someFunction($b);
在结果,我需要得到数组是这样的:
[
'a1' => ['a2' => ['a3' => 100]]
]
我怎样才能建立这个数组?当然,3对象只是一个例子,这个值可能会更大或更小,所以我想我需要递归函数。
答
另一种解决方案,但没有全局变量:
function nested($ob, $val, $res){
if($res == array()) {
$res = $val;
}
$res = array($ob->key => $res);
if(is_object($ob->parent)){
$res = nested($ob->parent, $val, $res);
}
return($res);
}
$res = nested($b->objects[count($b->objects) - 1], $b->value, array());
echo("<pre>");
print_r($b);
print_r($res);
答
从对象结构转换
{
'objects':[
{
'key':'a1'
},
{
'key':'a2',
'parent':{
'key':'a1'
},
},
{
'key':'a3',
'parent':{
'key':'a2',
'parent':{
'key':'a1'
}
}
}
],
'value':100
}
到:
[
'a1' => ['a2' => ['a3' => 100]]
]
是不平凡的。你必须自己创建一些功能。
+0
是的,我正在请求帮助建立这个功能=) – engilexial
+0
我认为我会这样做:在最后一个元素,递归替换,例如,'父'与值'key'。但是还有其他的选择吗? – engilexial
答
这是一个非常有趣的任务来解决!感谢发布。它仍然不是完美的代码,因为函数中有一个全局变量,但它可以工作。我希望它很简单。我甚至用四个物体测试过它。
$res = array();
function nested($ob, $val){
global $res;
if($res == array()) {
$res = $val; // Set the deepest value in the array to $val
}
// Form: put a new array around the old
$res = array($ob->key => $res);
if(is_object($ob->parent)){
nested($ob->parent, $val); // parent -> go deeper
}
}
nested($b->objects[count($b->objects) - 1], $b->value);
echo("<pre>");
print_r($b);
print_r($res);
我希望帮助:)
你想建立自己的对象,然后用(数组)$对象转换呢? – mkaatman
期望的效果未被充分定义。你是因为父母关系还是因为价值变量而得出你的结果?因为其中之一是多余的。你也应该至少试着想出一个你的函数的原型,并在这里发布。 – Kempeth