2009-09-25 8 views
0

Je sais que je peux passer à travers chaque niveau de l'objet, mais je voudrais une approche plus simple à cela.PHP Un moyen simple d'obtenir de la valeur à partir d'un objet multi-niveau

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 de cette valeur Id de type_5, comment pourrais-je l'obtenir dans une solution simple.

Quelques autres points à méditer:

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

J'ai entendu parler récursivité, mais je n'ai rien trouvé que je pense que je pourrais utiliser qui reste simple. Peut-être que de meilleurs tutoriels pourraient m'aider. Si je savais dans quelle partie du tableau d'objet la valeur dont j'avais besoin se trouvait, pourrais-je l'appeler directement? quelque chose comme: $ object [5] -> id ???

Répondre

2

Voici comment fonctionne la récursivité (généralement)

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

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

Vous démarrez avec une entrée, et vous dites à la fonction de continuer à s'appeler jusqu'à ce qu'elle 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, les éléments suivants:

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

Merci cela a vraiment aidé –

2

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(); 
+0

SObject est déjà une classe. J'utilise ceci mais comment puis-je faire si simple: $ queryResults-> records [0] -> sobjects [0] -> sobjects [0] -> sobjects [0] -> sobjects [0] -> Id –

+0

@Phill : vous devez étendre la classe utilisée avec la fonction getId décrite ci-dessus. Êtes-vous capable de modifier la classe sobject? – erenon

+0

@Phill: Vous appelez $ queryResults-> records [0] -> getId(); – Aistina

1

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