2011-08-09 3 views
7

J'ai recherché une solution à ce problème sans succès réel. J'ai un tableau multidimensionnel de parents et d'enfants sans limites de profondeur. Il est généré à partir d'une base de données, mais le problème est que l'ID de l'élément devient la clé en utilisant ma façon d'arranger un tableau plat dans un tableau multidimensionnel comme ceci:Réinitialiser les clés d'un tableau dans un tableau multidimensionnel

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

Ce que je voudrais, est une fonction qui fait la suivant:

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

essentiellement à partir de touches réaffectez 0. J'ai essayé de nombreuses méthodes, mais je suppose que je dois trouver une solution récursive et quand j'ai essayé, il a détruit mon tableau. Je lisais sur la fonction array_walk_recursive(), mais je ne sais pas quoi faire au-delà de ça. Essentiellement, existe-t-il un moyen de réinitialiser les clés numériques dans un tableau multidimensionnel?

Merci pour l'aide!

+0

J'ai répondu à votre question tion juste après que vous l'ayez demandé. C'est 2 heures plus tard, tu vas y retourner? Si cela répond à votre question, veuillez cliquer sur l'icône de coche à côté de la réponse pour la marquer comme acceptée. –

Répondre

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

Grande, solution élégante +1 – RageD

+0

Super! Merci. Je n'ai pas reçu d'e-mail, donc je n'ai vérifié que maintenant. – flicker

+1

Cela fonctionne mais je perds les touches de tableau qui ne sont pas numériques, comment est-ce que je ne ferais que réaffecter des touches numériques? Merci – flicker

11

je tente de résoudre le même problème, voici le code

$array = array_values($array); 
10

Vous avez vraiment besoin d'ajouter la condition is_numeric pour arrêter les clés de texte se mélanger ...

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; 
} 

Je l'ai fait à la place:

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

Fantastique! Cela a fonctionné brillamment pour moi, alors que la réponse correcte actuelle n'a pas. – Patrick

Questions connexes