Question

Je sais que je peux boucle à travers chaque niveau de l'objet, mais je voudrais une approche plus simple à cela.

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
)

J'ai besoin cette identifiant de type_5, comment pourrais-je obtenir ce dans une solution simple.

Quelques autres points à méditer:

  • Je sais pas la taille ou la profondeur de l'objet de tableaux vais aller, pourrait être plus ou moins de 5

Je l'ai entendu parler de récursion mais havn't trouvé tout ce que je pense que je pourrais l'utiliser reste simple. Peut-être de meilleurs tutoriels me aider. Si je ne savais dans quelle partie du tableau d'objet la valeur que je NEEDE était ce que je pourrais appeler simplement directement? quelque chose comme: $ object [5] -> id ???

Était-ce utile?

La solution

Voici comment fonctionne récursion (en général)

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

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

Vous commencez avec une entrée, et vous dire la fonction de continuer à appeler lui-même jusqu'à ce qu'il puisse retourner une sortie valide. Dans votre cas, vous pouvez le faire de cette façon:

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

Maintenant, puisque vous utilisez un tableau pour sobjects, vous pouvez remplacer la ligne ci-dessous #SEE ci-dessous, ce qui suit:

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

Autres conseils

Il est très simple:

class SObject{
/*...*/

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

Et vous appelez

$id = $query_obj->getId();

Dump cela comme un XML et utiliser XPath sur si vous avez besoin de faire beaucoup de queryes sur cette structure

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top