对于SOAP服务,我必须生成一个对象,该对象可以具有任意数量的相同类型的嵌套对象。我提出的唯一可行解决方案是使用eval。我稍微简化了代码,实际上$ nestedObjArray中的对象要大得多。
$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$finalObj = new stdClass();
for ($i = 0; $i < count($nestedObjArray); $i++) {
$nestedStr = str_repeat("->nested", $i);
eval('$finalObj->nested'.$nestedStr.' = $nestedObjArray[$i];');
}
生成以下3个语句:
$finalObj->nested = $nestedObjArray[0];
$finalObj->nested->nested = $nestedObjArray[1];
$finalObj->nested->nested->nested = $nestedObjArray[2];
这很好用,但很难看。谁能想到更优雅的解决方案?顺便说一句,以下而不是eval行不起作用:
$finalObj->nested{$nestedStr} = $nestedObjArray[$i];
答案 0 :(得分:1)
使用参考变量
怎么样?$finalObj = new stdClass();
$addToObject = $finalObj;
for ($i = 0; $i < count( $nestedObjArray ); $i ++) {
$addToObject->nested = $nestedObjArray[$i];
$addToObject = $addToObject->nested;
}
PS变量属性的正确语法是$finalObj->nested->{$nestedStr}
PPS我只是想知道这个目的是什么?
答案 1 :(得分:1)
这个怎么样:
$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$finalObj = new stdClass();
$thisObj = &$finalObj;
for ($i = 0; $i < count($nestedObjArray); $i++) {
$thisObj->nested = $nestedObjArray[$i];
$thisObj = &$thisObj->nested;
}
或者即使你想要删除其中的两行,这个:
$nestedObjArray = array();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$nestedObjArray[] = new stdClass();
$finalObj = new stdClass();
for ($i = 0, $thisObj = &$finalObj; $i < count($nestedObjArray); $i++, $thisObj = &$thisObj->nested) {
$thisObj->nested = $nestedObjArray[$i];
}
答案 2 :(得分:1)
你真正应该做的是保留一个指向内部对象的单独变量。例如......
$finalObj = new stdClass();
$innerObj = $finalObj;
for($i = 0; $i < count($nestedObjArray); $i++) {
$innerObj->nested = $nestedObjArray[$i];
$innerObj = $innerObj->nested;
}