Pergunta

Eu sei que pode fazer um loop através de cada nível do objeto, mas eu gostaria de ter uma abordagem mais simples para isso.

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
)

Eu preciso deste valor Id de type_5, como eu poderia conseguir isso em uma solução simples.

Alguns outros pontos para pensar:

  • eu não sei quão grande ou quão profundo o objeto de matrizes vão, poderia ser mais ou menos do que 5

Eu ouvi sobre recursão, mas havn't encontrado qualquer coisa que eu acho que eu poderia usar que mantém simples. Talvez alguns tutoriais melhores iria me ajudar. Se eu sabia em que parte da matriz de objeto o valor I neede estava em que eu poderia apenas chamá-lo diretamente? algo como: $ object [5] -> id ???

Foi útil?

Solução

Aqui está como funciona a recursão (geralmente)

function recursiveFunctionName( input ) // returns value;
{
    //Do something to input to make it new_input

    if( isSomethingAccomplished )
    {
        return value;
    }
    else
    {
        return recursiveFunctionName( new_input );
    }
}

Você começa com uma entrada, e você dizer a função para continuar a chamar-se até ele pode retornar uma saída válida. No seu caso, você poderia fazê-lo desta maneira:

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 ] );
    }
}

Agora, desde que você está usando uma matriz para sobjects, você pode querer substituir a linha abaixo #SEE ABAIXO, com o seguinte:

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

Outras dicas

É muito simples:

class SObject{
/*...*/

    public getId(){
        if(isset($this->Id)){
            return $this->Id;
        } else {
            return $this->sobjects[0]->getId();
        }
    }
}

E você chama

$id = $query_obj->getId();

Dump isso como um XPath XML e uso nele se precisar de fazer muito queryes sobre essa estrutura

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top