PHP Простой способ получить значение из многоуровневого объекта
-
16-09-2019 - |
Вопрос
Я знаю, что могу пройти через каждый уровень объекта, но мне хотелось бы более простой подход.
QueryResult Object
(
[queryLocator] =>
[done] => 1
[records] => Array
(
[0] => SObject Object
(
[type] => type_1
[fields] =>
[sobjects] => Array
(
[0] => SObject Object
(
[type] => type_2
[fields] =>
[sobjects] => Array
(
[0] => SObject Object
(
[type] => type_3
[fields] =>
[sobjects] => Array
(
[0] => SObject Object
(
[type] => type_4
[fields] =>
[sobjects] => Array
(
[0] => SObject Object
(
[type] => type_5
[fields] =>
[Id] => 12345_I_need_this
)
)
)
)
)
)
)
)
)
)
[size] => 1
)
Мне нужно значение идентификатора type_5, как я могу получить это в простом решении.
Еще несколько моментов, о которых стоит подумать:
- Я не знаю, насколько велик и насколько глубок объект массива, может быть больше или меньше 5
Я слышал о рекурсии, но не нашел ничего, что, по моему мнению, можно было бы использовать, чтобы упростить ее.Возможно, мне помогут какие-нибудь лучшие уроки.Если бы я знал, в какой части массива объектов находится нужное мне значение, мог бы я просто вызвать его напрямую?что-то вроде:$object[5]->id ???
Решение
Вот как работает рекурсия (в целом)
function recursiveFunctionName( input ) // returns value;
{
//Do something to input to make it new_input
if( isSomethingAccomplished )
{
return value;
}
else
{
return recursiveFunctionName( new_input );
}
}
Вы начинаете с ввода и указываете функции, чтобы она продолжала вызывать саму себя до тех пор, пока не сможет вернуть действительный результат.В вашем случае это можно сделать так:
function getID( SObject $so )
{
// equates to isSomethingAccomplished... You have found the value
// you want returned, so pass that out.
if( $so->id )
{
return $so->id;
}
else
{
// otherwise, this will return the value from the next level,
// pass that out.
# SEE BELOW FOR ONE MORE NOTE HERE.
return getID( $so->sobjects[ 0 ] );
}
}
Теперь, поскольку вы используете массив для объектов, вы можете заменить строку ниже #SEE BELOW на следующую:
$objs = $so->sobjects;
$count = count( $objs );
// Iterate through all of its children, testing each of the child nodes.
// (You're actually using iteration and recursion in combination here).
for( $i = 0; $i < $count; $i++ )
{
$curr = getID( $objs[ $i ] );
// This is the same test as above.
if( $curr )
{
return $curr;
}
}
Другие советы
Это очень просто:
class SObject{
/*...*/
public getId(){
if(isset($this->Id)){
return $this->Id;
} else {
return $this->sobjects[0]->getId();
}
}
}
И ты звонишь
$id = $query_obj->getId();
Сохраните это как XML и используйте для него XPATH, если вам нужно сделать много запросов к этой структуре.