2010-06-23 5 views
0

j'ai un tableau qui ressemble àLooping par un tableau et l'insertion dans une table avec la relation parent-enfant

 Array 
    (
    [438044691:maincategoryone] => Array 
    (
     [0] => Array 
     (
     [id] => 438044692 
     [name] => main category one item one 
        [category] => Array 
        (
         [2] => Array 
         (
          [id] => 4380444456 
          [name] => main category one item one - sub 
         ) 

        ) 
     ) 

     [1] => Array 
     (
     [id] => 438044693 
     [name] => main category one item two 
     ) 
    ) 

    [438044701:maincategorytwo] => Array 
    (
     [0] => Array 
     (
     [id] => 438044702 
     [name] => main category two item one 
     ) 

    ) 

    [438044709:maincategorythree] => Array 
    (
     [0] => Array 
     (
     [id] => 438044710 
     [name] => main category three item one 
     ) 

     [1] => Array 
     (
     [id] => 438044711 
     [name] => main category three item two 
     ) 

    ) 
) 

Comment puis-je boucle à travers cela en PHP et stocker les données dans une relation parent-enfant-petit-enfant-mère dans la même table (MYSQL).

Un exemple de requête pour récupérer les données dans l'ordre (parent-enfant-petit-enfant) une fois inséré serait génial.

J'espère que ma question est logique. Si non, excusez-moi, mais je serai en mesure de vous donner plus d'informations.

Merci beaucoup.

+0

Avez-vous une profondeur infinie ou s'arrête-t-il à petit-enfant (je veux dire les petits-enfants sont leafs)? – greg0ire

+0

bien la profondeur maximale sera 3 qui est sous-subsub principale. Je ne pense pas que ça ira plus loin. – bharath

Répondre

0

Je propose une clé de référence au parent dans votre table mySQL, comme ceci:

CREATE TABLE categories (id INTEGER, name VARCHAR(32), parent INTEGER) 

Et puis dans votre code PHP, vous avez un modèle d'arbre et que vous lisez tous les éléments dans un id indexé tableau, puis assembler dans un arbre.

$q = mysql_query("SELECT * FROM categories"); 
$n = mysql_num_rows($q); 
$items = array(); 

while($item = mysql_fetch_assoc($q)) 
    $items[$item['id']] = $item; 

foreach($items as $item) 
    $items[$item['parent']]['category'] = $item; 

print_r($items); 

Pour lire les valeurs de l'arbre, j'utiliser une fonction récursive:

function add_to_tree($items, $tree_part, $parent) { 
    $tree_part['parent'] = $parent; 
    $items.push($tree_part); 
    foreach($tree_part['categories'] as $child) 
     add_to_tree($items, $child, $tree_part['id']); 
} 

Il vous suffit de créer un tableau vide, le remplir et lire les valeurs sequencially.

$items = array(); 
add_to_tree($items, $tree); 
foreach($items as $item) 
    mysql_query("INSERT INTO categories VALUES('{$item['id']}', '{$item['name']}', '{$item['parent']}'); 

Bien sûr, vous devrez gérer des cas particuliers comme l'objet racine et les chaînons manquants, qui ne sont pas pris en charge dans le code précédent.

+0

hé merci pour votre réponse, cela pourrait fonctionner pour récupérer les données, mais d'abord je dois être en mesure d'insérer les données dans la table avec la relation parent-enfant-grand enfant de la matrice affichée ouais. – bharath

+0

oui je viens de réaliser la partie manquante :) éditée en conséquence. – slaphappy

+0

salut bien quel est le paramètre parent $ passé à add_to_tree? aussi la fonction, va-t-elle renvoyer le $ tree_part ?. et ohh je pense que $ items.push ne fonctionnera pas en PHP alors j'imagine que c'est array_push ?. – bharath

0

Vous pouvez le faire en créant une table avec 3 colonnes id, name, parentid

Vous pouvez utiliser la fonction PHP array_walk à marcher dans le tableau et insérez les lignes que vous allez (ou construire une requête SQL exécuter plus tard):

$myArray = ...... 
    array_walk($myArray , 'insertInDb', null); 

    function insertInDb($item, $key, $parent_id) { 
     if (is_null($parent_id)) { 
      $sql = sprintf('INSERT INTO myTable (`id`, `name`, `parentid`) VALUES (%d, "%s", NULL)', $item['id'], $item['name']); 
     } else { 
      $sql = sprintf('INSERT INTO myTable (`id`, `name`, `parentid`) VALUES (%d, "%s", %d)', $item['id'], $item['name'], $parent_id); 
     } 
     array_walk($item['category'] , 'insertInDb', $item['id']); 
    } 
Questions connexes