Ensembles imbriqués, tableau php et transformation
-
20-08-2019 - |
Question
Je dois transformer la structure de mes ensembles imbriqués (mysql) en json pour cet arbre spatial 1) http://blog.thejit.org/wp -content / jit-1.0a / examples / spacetree.html
J'ai trouvé cette fonction pour créer un tableau à partir d'ensembles imbriqués: 2) http://semlabs.co.uk/journal/converting-nested-set-model-data-in-to-multi-dimensional-arrays-in-php
Je peux aussi convertir un tableau php en json avec la fonction PHP json_encode
Mon problème: la fonction nestify (à partir du deuxième lien) ne me donne pas exactement ce dont j'ai besoin. J'ai besoin de quelque chose comme ceci: http://pastebin.com/m68752352
Pouvez-vous m'aider à modifier la fonction "imbriquer"? donc ça me donne le bon tableau?
Voici cette fonction une fois de plus:
function nestify( $arrs, $depth_key = 'depth' )
{
$nested = array();
$depths = array();
foreach( $arrs as $key => $arr ) {
if( $arr[$depth_key] == 0 ) {
$nested[$key] = $arr;
$depths[$arr[$depth_key] + 1] = $key;
}
else {
$parent =& $nested;
for( $i = 1; $i <= ( $arr[$depth_key] ); $i++ ) {
$parent =& $parent[$depths[$i]];
}
$parent[$key] = $arr;
$depths[$arr[$depth_key] + 1] = $key;
}
}
return $nested;
}
La solution
L'extrait suivant devrait faire l'affaire, adapté du code PHP Doctrine que j'ai trouvé sur le Web:
function toHierarchy($collection)
{
// Trees mapped
$trees = array();
$l = 0;
if (count($collection) > 0) {
// Node Stack. Used to help building the hierarchy
$stack = array();
foreach ($collection as $node) {
$item = $node;
$item['children'] = array();
// Number of stack items
$l = count($stack);
// Check if we're dealing with different levels
while($l > 0 && $stack[$l - 1]['depth'] >= $item['depth']) {
array_pop($stack);
$l--;
}
// Stack is empty (we are inspecting the root)
if ($l == 0) {
// Assigning the root node
$i = count($trees);
$trees[$i] = $item;
$stack[] = & $trees[$i];
} else {
// Add node to parent
$i = count($stack[$l - 1]['children']);
$stack[$l - 1]['children'][$i] = $item;
$stack[] = & $stack[$l - 1]['children'][$i];
}
}
}
return $trees;
}