PHP Простой способ получить значение из многоуровневого объекта

StackOverflow https://stackoverflow.com/questions/1477872

Вопрос

Я знаю, что могу пройти через каждый уровень объекта, но мне хотелось бы более простой подход.

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, если вам нужно сделать много запросов к этой структуре.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top