2010-03-24 9 views
5

Estoy tratando de encontrar una forma de devolver el valor de la clave principal de una matriz.PHP - Encontrar la clave padre de la matriz

Por ejemplo, en el siguiente cuadro me gustaría encontrar la clave del padre donde $ array ['id'] == "0002". La clave principal es obvia porque está definida aquí (sería 'productos'), pero normalmente sería dinámica, de ahí el problema. Sin embargo, se conoce el 'id' y el valor de 'id'.

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

Respuesta

1

Un poco recursividad crudo, pero debería funcionar:

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

No estoy muy familiarizado con la recursividad, pero codificado por una respuesta similar a este, solamente he utilizado una variable 'estático' para reemplazar el argumento '$ parent' que usa. ¿Es de alguna manera mejor? – alex

+0

@alex 'static' probablemente funcionaría bien también. Tengo que admitir que no soy un usuario 'estático'. :) Eliminaría la necesidad de transmitir la variable adicional. OTOH, en la función de arriba puedes especificar un padre "predeterminado" ... Cualquiera de los dos está bien, supongo. :) – deceze

+0

Gracias, entiendo los beneficios de su método. +1 – alex

2

Ya que tiene una estructura de árbol, ya sea de un BFS o DFS puede hacerlo. Como la estructura es variable, una solución recursiva funcionaría bien. Simplemente devuelva un centinela cuando encuentre el valor, luego devuelva la clave a la persona que llama.

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

} 
Cuestiones relacionadas