2010-03-24 11 views
5

J'essaie de trouver un moyen de retourner la valeur de la clé parent d'un tableau. Par exemple, dans le tableau ci-dessous, j'aimerais trouver la clé du parent où $ array ['id'] == "0002". La clé parent est évidente car elle est définie ici (ce serait 'produits'), mais normalement elle serait dynamique, d'où le problème. Le 'id' et la valeur de 'id' sont connus cependant.PHP - Trouver la clé parent du tableau

[0] => Array 
     (
      [data] => 
      [id] => 0000 
      [name] => Swirl 
      [categories] => Array 
       (
        [0] => Array 
         (
          [id] => 0001 
          [name] => Whirl 
          [products] => Array 
           (
            [0] => Array 
             (
              [id] => 0002 
              [filename] => 1.jpg 
             ) 
            [1] => Array 
             (
              [id] => 0003 
              [filename] => 2.jpg 
             ) 
           ) 
         ) 
       ) 
     ) 

Répondre

1

Un peu récursion brut, mais il devrait fonctionner:

function find_parent($array, $needle, $parent = null) { 
    foreach ($array as $key => $value) { 
     if (is_array($value)) { 
      $pass = $parent; 
      if (is_string($key)) { 
       $pass = $key; 
      } 
      $found = find_parent($value, $needle, $pass); 
      if ($found !== false) { 
       return $found; 
      } 
     } else if ($key === 'id' && $value === $needle) { 
      return $parent; 
     } 
    } 

    return false; 
} 

$parentkey = find_parent($array, '0002'); 
+0

Je ne suis pas trop familier avec récursion, mais je code une réponse semblable à cela, que j'ai utilisé une variable « statique » pour remplacer l'argument '$ parent' que vous utilisez. Est-ce que l'une ou – alex

+0

@alex 'static' fonctionnerait probablement bien aussi. Je dois admettre que je ne suis pas un utilisateur statique. :) Cela éliminerait le besoin de transmettre la variable supplémentaire. OTOH, dans la fonction ci-dessus, vous pouvez spécifier un parent "par défaut" ... Soit on va bien je suppose. :) – deceze

+0

Merci, je comprends les avantages de votre méthode. +1 – alex

2

Puisque vous avez une structure arborescente soit d'un BFS ou DFS peut le faire. Puisque la structure est variable, une solution récursive fonctionnerait bien. Renvoyez simplement une sentinelle lorsque vous trouvez la valeur, puis renvoyez la clé dans l'appelant.

-2
function array_to_xml($array, $rootElement = null, $xml = null) { 

    $_xml = $xml; 

    if ($_xml === null) { 
     $_xml = new SimpleXMLElement($rootElement !== null ? $rootElement : '<root/>'); 
    } 

    $has_int_key = 0; 

    foreach ($array as $k => $v) { 
     if (is_array($v)) { 
      if(is_int($k)){ 
       $this->array_to_xml($v, $k, $_xml->addChild($rootElement)); 
      } 
      else { 
       foreach($v as $key=>$value) { 
        if(is_int($key)) $has_int_key = 1; 
       } 

       if ($has_int_key) { 
        $this->array_to_xml($v, $k, $_xml); 
       } else { 
        $this->array_to_xml($v, $k, $_xml->addChild($k)); 
       } 
      } 
     } 
     else { 
      $_xml->addChild($k, $v); 
     } 
    } 

    return $_xml->asXML(); 

} 
Questions connexes