Creation d'une array recursive

Creation d'une array recursive - PHP - Programmation

Marsh Posté le 26-03-2009 à 10:33:27    

Bonjour, j'ai des données de ce type    /11/68,   /56/89/188.......
 
je voudrais pour chaque valeur créer un arbre genre


Array
(
    [11] => Array
        (
           [68] => null
        )
 
)
 
 
Array
(
    [56] => Array
        (
           [89] => Array
                 (
                 [188] => null  
             )
        )
 
)
 


Message édité par stealth35 le 26-03-2009 à 10:33:43
Reply

Marsh Posté le 26-03-2009 à 10:33:27   

Reply

Marsh Posté le 26-03-2009 à 10:48:47    

et c'est quoi la question, précisément :??: Je vois pas où est ton pb...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-03-2009 à 10:51:37    

mon problème c'est que la je viens d'écrire ca a la main, mais je veux une fonction pour faire ca

Reply

Marsh Posté le 26-03-2009 à 11:42:23    

j'ai cherché 1 peu mais j'ai pas trouvé grand chose de concluant. J'ai déjà travaillé avec ce genre de structure et j'utilise un tableau associatif de ce type :

Code :
  1. $ArrayTree = array("Value" => array(), "Level" => array());


 
Avec explode sur '/', ça se remplit facilement :

Code :
  1. $ArrayData = array("11/68", "56/89/188" );
  2. $ArrayTree = array("Value" => array(), "Level" => array());
  3. foreach($ArrayData as $d => $Data)
  4. {
  5.     $ArrayTmp = explode('/', $Data);
  6.     foreach($ArrayTmp as $t => $Value)
  7.     {
  8.         $ArrayTree["value"][] = $Value;
  9.         $ArrayTree["Level"][] = $t;
  10.     }
  11. }


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-03-2009 à 11:48:13    

je suis sur que c'est tout con,
enfaite a la fin avec array_merge_recursive, j'aimerai un tableau unique avec mes valeurs dedoublonner genre :

 

11/68,  56/89/188, 11/87/12

 

Array
(
    [11] => Array
        (
           [68] => null
           [87] => Array
                (
                  [12] => null
             )
        )

 

[56] => Array
        (
           [89] => Array
                 (
                 [188] => null  
             )
        )
 
)


Message édité par stealth35 le 26-03-2009 à 13:07:15
Reply

Marsh Posté le 26-03-2009 à 12:29:16    

Dans ton exemple, pourquoi 89 et 188 sont des fils de 11 ? Et pourquoi 89 et 12 n'apparaissent pas à la racine ?  
 
A priori, ce que tu souhaites faire, c'est obtenir un arbre classique, c'est cela ?

Reply

Marsh Posté le 26-03-2009 à 12:35:25    

Normalement, en passant le tableau des données au format string avec une fonction en récursif, tu pourrais obtenir ton tableau final, non ?


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
Reply

Marsh Posté le 26-03-2009 à 13:05:29    

oula je me suis tromper dans mes exemples, j'ai corrigé,
 
guybrush02-> oui pour l'abre classique
DaSayan-> en json peu etre
 

Reply

Marsh Posté le 26-03-2009 à 14:22:48    

Ce que tu souhaites, c'est avoir l'affichage que tu as montré, ou bien c'est le stockage représenté par ton affichage ?  
 
Si c'est ce dernier point, ça se construit comme un arbre classique, en pseudo-pseudo-pseudo-code :  
 

Code :
  1. f(tree, str):
  2.   head, tail = lsplit("/", str, 1)
  3.   add(head, tree)
  4.   if tail is non empty:
  5.     return f(tree[head], tail)
  6.   else
  7.     return tree


et pour  

Code :
  1. add(el, tree):
  2.   if tree:
  3.     if not ( tree haskey el):
  4.       tree[el] = null
  5.   else:
  6.     tree = array(el)


Ou quelque chose du genre, mais l'idée est là (désolé, je n'ai malheureusement pas bcp de temps pour écrire ça un peu mieux et plus formellement).

Reply

Marsh Posté le 26-03-2009 à 14:57:30    

j'ai essayer de faire ton pseudo-pseudo-pseudo-code  en php
 
on doit pas etre loin mem si ca marche pas
 

$list = "11/64/89/189";
 $array = array();
 
 f($array, $list);
 
 function f($tree, $str){
  $chaine = split("/", $str, 2);
  $head = $chaine[0];
  $tail = $chaine[1];
  $tree = add($head, $tree);
  if($tail){
   return f($tree[$head], $tail);
  }else{
   return $tree;
  }
 }
 
 function add($el, $tree){
  if(is_array($tree)){
   if(array_key_exists($el, $tree)){
    $tree[$el] = null;
   }else{
    $tree = array($el);
   }
 
  }
return $tree;
 
 }


Message édité par stealth35 le 26-03-2009 à 15:20:08
Reply

Marsh Posté le 26-03-2009 à 14:57:30   

Reply

Marsh Posté le 26-03-2009 à 16:54:54    

bon j'ai reussi mais en json, donc si quelqu'un trouve sans passer par le json ca serais mieux
 

$list = "11/64/89/189";
 
 $l = f('', $list);
 print_r(json_decode($l, true));
 
 function f($tree, $str){
  $chaine = split("/", $str, 2);
  $head = $chaine[0];
  $tail = @$chaine[1];
 
  $tree .=  '{';  
  $tree .=  '"' . $head . '":';
   
  if($tail){  
   $tree =  f($tree, $tail);    
  }else{
   $tree .=  'null';
  }
   
  $tree .=  '}';
   
  return $tree;
 }


Message édité par stealth35 le 26-03-2009 à 16:55:04
Reply

Marsh Posté le 02-09-2009 à 00:34:31    

un petit UP parce j'ai un serveur qui gere pas le json, et je voudais que ca soit plus propre quand meme (pas se serialize non plus)


Message édité par stealth35 le 02-09-2009 à 00:34:43
Reply

Marsh Posté le 02-09-2009 à 02:09:51    

ducoup je me re repond que j'ai reussi

 


$paths = explode('/', $item);
array_shift($paths);  
$depth = count($paths) - 1;
 
$tree = array_fill_keys($paths, array());  
 
while($depth)
{
    $cat = $paths[$depth - 1];
   
    $last = array_pop($paths);
    $tree[$cat] = array($last  => $tree[$last]);
    array_pop($tree);
 
    --$depth;
}
 
print_r($tree);


Message édité par stealth35 le 02-09-2009 à 02:10:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed