2010-03-12 9 views
0

J'ai une fonction de récurrence qui analyse un objet/tableau avec une variable globale. Si je commente la variable globale, je n'obtiens rien, mais si je la laisse, elle ajoute au tableau d'autres valeurs qui devraient être dans son propre jeu de résultats. Ai-je besoin de changer quelque chose ici?php recursion variable globale?

MISE À JOUR # 2: Comment puis-je obtenir le retour que je veux, je pensais que je poussais toutes les valeurs uniques à la matrice?

function getResp($objectPassed) { 

    foreach($objectPassed as $element) { 
     if(is_object($element)) { 
      // recursive call 
      $in_arr = getResp($element); 
     }elseif(is_array($element)) { 
      $in_arr = getResp($element); 
     } else { 
      // XML is being passed, need to strip it 
      $element = strip_tags($element); 

      // Trim whitespace 
      $element = trim($element); 

      // Push to array 
      if($element != '') { 
       if (!preg_match("/^[0-9]$/", $element)) { 
        if (!in_array($element,$in_arr)) { 
         $in_arr[] = $element; 
        } 
       } 
      } 
     } 
    } 
    return $in_arr; 
} 

ENTRÉE:

stdClass Object 
(
    [done] => 1 
    [queryLocator] => 
    [records] => Array 
     (
      [0] => stdClass Object 
       (
        [type] => typeName 
        [Id] => Array 
         (
          [0] => a0E50000002jxhmEAA 
          [1] => a0E50000002jxhmEAA 
         ) 

       ) 

      [1] => stdClass Object 
       (
        [type] => typeName 
        [Id] => Array 
         (
          [0] => a0E50000002jxYkEAI 
          [1] => a0E50000002jxYkEAI 
         ) 

       ) 

     ) 

    [size] => 2 
) 

RETOUR:

Array 
(
    [0] => a0E50000002jxYkEAI 
) 

RETOUR WANTED:

Array 
(
    [0] => a0E50000002jxYkEAI 
    [1] => a0E50000002jxhmEAA 
) 
+0

Ne devriez-vous pas stocker la valeur de retour des appels récursifs? Comme si: $ in_arr = getResp ($ element); – Sebastian

+0

Thnx @Sebastian J'ai fait le changement mais je n'obtiens toujours pas les résultats que je voudrais –

+0

Oh oui, je pense que je le vois maintenant. Essayez $ in_arr [] = getResp ($ element); :-) – Sebastian

Répondre

5

est une variable globale nécessaire? Sinon, vous pouvez simplifier ainsi:

function getResp($objectPassed, &$in_arr = array()) { // <-- note the reference '&' 

    foreach($objectPassed as $element) { 
     if(is_object($element) || is_array($element)) { // <-- else if statement simplified 
      getResp($element,$in_arr); 
     } else { 
      // XML is being passed, need to strip it 
      $element = strip_tags($element); 

      // Trim whitespace 
      $element = trim($element); 

      // Push to array 
      if($element != '' &&      // <-- everything in one test 
       !preg_match("/^[0-9]$/", $element) && 
       !in_array($element,$in_arr)) 
      {      
        $in_arr[] = $element; 
      } 
     } 
    } 
    return $in_arr; 
} 

Ensuite, vous faites:

$result = getResp($data); 

Si une fonction récursive doit accéder à la même ressource maintes et maintes fois (dans ce cas, le tableau initial), je serait toujours pass this as a reference.
Je ne sais pas si elle est mesurable mais je suppose que c'est beaucoup plus efficace que de copier des valeurs.

+0

Je pense que c'est ce dont j'ai besoin, je le mets à l'essai maintenant –

+1

Merci cela m'a aidé énormément et m'a aussi donné un aperçu sur la façon de faire de la récursivité –