Использование eval для динамических вложенных объектов - PullRequest
0 голосов
/ 10 января 2012

Для службы 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];

Ответы [ 3 ]

1 голос
/ 10 января 2012

Как насчет этого:

$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;
}

Или даже если вы хотите удалить 2 из этих строк, это:

$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];
}
1 голос
/ 10 января 2012

Что вам действительно нужно сделать, так это сохранить отдельную переменную, которая указывает на внутренний объект.Например ...

$finalObj = new stdClass();
$innerObj = $finalObj;
for($i = 0; $i < count($nestedObjArray); $i++) {
    $innerObj->nested = $nestedObjArray[$i];
    $innerObj = $innerObj->nested;
}
1 голос
/ 10 января 2012

как насчет использования ссылочной переменной

$finalObj = new stdClass();
$addToObject = $finalObj;
for ($i = 0; $i < count( $nestedObjArray ); $i ++) {
    $addToObject->nested = $nestedObjArray[$i];
    $addToObject = $addToObject->nested;
}

PS. Правильный синтаксис для определения вероятности по переменной: $finalObj->nested->{$nestedStr}

PPS Мне просто интересно, для чего это нужно?

...