Frage

Ich weiß, dass ich jede Ebene des Objekts durchlaufen kann, aber ich hätte gerne einen einfacheren Ansatz dafür.

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
)

Ich benötige diesen ID-Wert vom Typ_5. Wie könnte ich diesen in einer einfachen Lösung erhalten?

Einige andere Punkte, über die Sie nachdenken sollten:

  • Ich werde nicht wissen, wie groß oder wie tief das Array-Objekt sein wird, es könnte mehr oder weniger als 5 sein

Ich habe von Rekursion gehört, aber nichts gefunden, von dem ich denke, dass ich es verwenden könnte, um es einfach zu halten.Vielleicht würden mir ein paar bessere Tutorials weiterhelfen.Wenn ich wüsste, in welchem ​​Teil des Objektarrays sich der Wert befindet, den ich benötige, könnte ich ihn dann einfach direkt aufrufen?etwas wie:$object[5]->id ???

War es hilfreich?

Lösung

So funktioniert die Rekursion (im Allgemeinen)

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

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

Sie beginnen mit einer Eingabe und weisen die Funktion an, sich selbst so lange aufzurufen, bis sie eine gültige Ausgabe zurückgeben kann.In Ihrem Fall könnten Sie es so machen:

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

Da Sie nun ein Array für Objekte verwenden, möchten Sie möglicherweise die Zeile unter #SEE BELOW durch Folgendes ersetzen:

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

Andere Tipps

Es ist sehr einfach:

class SObject{
/*...*/

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

Und du rufst an

$id = $query_obj->getId();

Speichern Sie dies als XML und verwenden Sie XPATH darauf, wenn Sie viele Abfragen für diese Struktur durchführen müssen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top