2011-08-09 19 views
7

He estado buscando una solución para esto sin éxito. Tengo una matriz multidimensional de padres e hijos sin límites de profundidad. Esto se genera a partir de una base de datos, pero el problema es que el ID de elemento se convierte en la clave utilizando mi manera de organizar una matriz plana en una matriz multidimensional de este modo:Restablecer las teclas de matriz en matriz multidimensional

Array(

[28] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [23] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [22] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [150] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

Lo que me gustaría, es una función que hace el siguiente:

Array (
[0] => Array 
     (
      [id] => 28 
      [color] => #ff24e5 
      [name] => Personal 
      [parent_id] => 
      [children] => Array 
       (
        [0] => Array 
         (
          [id] => 23 
          [color] => #41c3a3 
          [name] => Shopping 
          [parent_id] => 28 
          [children] => Array 
           (
            [0] => Array 
             (
              [id] => 22 
              [color] => #8be32b 
              [name] => Deals 
              [user_id] => 1 
              [selected] => 0 
              [parent_id] => 23 
              [children] => Array 
               (
               ) 
             ) 
           ) 
         ) 

        [1] => Array 
         (
          [id] => 150 
          [color] => #e9a3f0 
          [name] => Orders 
          [parent_id] => 28 
          [children] => Array 
           (
           ) 
         ) 
       ) 
     ) 
) 

reasignar Esencialmente llaves a partir de 0. he intentado numerosos métodos, pero estoy asumiendo que necesito encontrar una solución recursiva y cuando traté de eso, es destruido mi matriz. Estaba leyendo sobre la función array_walk_recursive(), pero no sé qué hacer más allá de eso. Básicamente, ¿hay alguna manera de restablecer las teclas numéricas en una matriz multidimensional?

¡Gracias por la ayuda!

+0

respondí sus colas justo después de que lo haya preguntado. Son 2 horas más tarde, ¿vas a regresar? Si esto responde su pregunta, haga clic en el icono de marca de verificación junto a la respuesta para marcarla como aceptada. –

Respuesta

12
function fix_keys($array) { 
    foreach ($array as $k => $val) { 
    if (is_array($val)) 
     $array[$k] = fix_keys($val); //recurse 
    } 
    return array_values($array); 
} 
+0

Solución genial y elegante +1 – RageD

+0

¡Genial! Gracias. No recibí un correo electrónico, así que solo lo compruebo ahora. – flicker

+1

Esto funciona, pero estoy perdiendo las teclas de matriz que no son numéricas, ¿cómo voy a proceder solo a reasignar las teclas numéricas? Gracias – flicker

11

yo estaba tratando de solucionar el mismo problema, aquí está el código

$array = array_values($array); 
10

Realmente es necesario añadir la condición is_numeric para detener teclas de texto se mezclen ...

function fix_keys($array) { 

    foreach ($array as $k => $val) { 

     if (is_array($val)) 
      $array[$k] = $fix_keys($val); //recurse 
    } 

    if(is_numeric($k)) 
     return array_values($array); 

    return $array; 
} 

hice esto en su lugar:

function fix_keys($array) { 
    $numberCheck = false; 
    foreach ($array as $k => $val) { 
     if (is_array($val)) $array[$k] = fix_keys($val); //recurse 
     if (is_numeric($k)) $numberCheck = true; 
    } 
    if ($numberCheck === true) { 
     return array_values($array); 
    } else { 
     return $array; 
    } 
} 
+0

¡Fantástico! Esto funcionó brillantemente para mí, mientras que la respuesta correcta actual no. – Patrick

Cuestiones relacionadas