2010-03-24 9 views
5

Sto cercando di trovare un modo per restituire il valore della chiave madre di un array.PHP - Trova chiave principale dell'array

Ad esempio, dall'array qui sotto vorrei trovare la chiave del genitore dove $ array ['id'] == "0002". La chiave genitore è ovvia perché qui è definita (sarebbe "prodotti"), ma normalmente sarebbe dinamica, da qui il problema. L''id' e il valore di 'id' sono comunque noti.

[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 
             ) 
           ) 
         ) 
       ) 
     ) 

risposta

1

Un po 'grezzo ricorsione, ma dovrebbe funzionare:

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

Io non sono troppo familiarità con la ricorsione, ma ho codificato una risposta simile a questo, solo che ho usato una variabile 'statica' per sostituire l'argomento '$ parent 'che usi. In entrambi i casi è meglio? – alex

+0

@alex 'static' probabilmente funzionerebbe bene. Devo ammettere che non sono molto un utente 'statico'. :) Eliminerebbe la necessità di passare lungo la variabile extra. OTOH, nella funzione sopra puoi specificare un genitore "predefinito" ... O uno va bene, immagino. :) – deceze

+0

Grazie, comprendo i vantaggi del tuo metodo. +1 – alex

2

Dal momento che si dispone di una struttura ad albero o di un BFS o DFS può farlo. Poiché la struttura è variabile, una soluzione ricorsiva funzionerebbe bene. È sufficiente restituire una sentinella quando si trova il valore, quindi restituire la chiave nel chiamante.

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

} 
Problemi correlati