create - php array assoc
Convierte 2d array en 3d con PHP (2)
<?php
$p = array(0 => array());
foreach($nodes as $n)
{
$pid = $n[''pid''];
$id = $n[''id''];
if (!isset($p[$pid]))
$p[$pid] = array(''child'' => array());
if (isset($p[$id]))
$child = &$p[$id][''child''];
else
$child = array();
$p[$id] = $n;
$p[$id][''child''] = &$child;
unset($p[$id][''pid'']);
unset($p[$id][''level'']);
unset($child);
$p[$pid][''child''][] = &$p[$id];
// $p[$pid][''child''] = &$p[$id]; // or this, if only one child
}
$nodes = $p[''0''][''child''];
unset($p);
?>
Si cada nodo solo puede tener un hijo, entonces reemplace la línea con $p[$pid][''child''] = &$p[$id];
.
(Editar: lo arregló para que funcione, independientemente de cómo se clasifiquen los nodos).
Hay una matriz 2d simple con algún tipo de árbol como este:
- nodo1
- nodo2
- nodo3
- nodo2
Su estructura es:
array(
array (
''id'' : 1,
''pid'': 0,
''title'' : ''node1'',
''level'' : 1
),
array (
''id'' : 2,
''pid'': 1,
''title'' : ''node2'',
''level'' : 2
),
array (
''id'' : 3,
''pid'': 2,
''title'' : ''node3'',
''level'' : 3
),
)
¿Hay soluciones con PHP para convertir esta matriz en:
array(
array (
''id'' : 1,
''title'' : ''node1'',
''child'' : array (
''id'' : 2,
''title'' : ''node2'',
''child'' : array (
''id'' : 3,
''title'' : ''node3'',
),
),
)
...
)
Se encontró la función @SO PHP Traversing para convertir una única matriz en una matriz anidada con elementos secundarios , en función de la ID padre
$inArray = array(
array(''ID'' => ''1'', ''parentcat_ID'' => ''0''),
array(''ID'' => ''2'', ''parentcat_ID'' => ''0''),
array(''ID'' => ''6'', ''parentcat_ID'' => ''1''),
array(''ID'' => ''7'', ''parentcat_ID'' => ''1''),
array(''ID'' => ''8'', ''parentcat_ID'' => ''6''),
array(''ID'' => ''9'', ''parentcat_ID'' => ''1''),
array(''ID'' => ''13'', ''parentcat_ID'' => ''7''),
array(''ID'' => ''14'', ''parentcat_ID'' => ''8''),
);
function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) {
if(!is_array($inArray)) {
return;
}
if(!is_array($outArray)) {
return;
}
foreach($inArray as $key => $tuple) {
if($tuple[''parentcat_ID''] == $currentParentId) {
$tuple[''children''] = array();
makeParentChildRelations($inArray, $tuple[''children''], $tuple[''ID'']);
$outArray[] = $tuple;
}
}
}
$outArray = array();
makeParentChildRelations($inArray, $outArray);
print_r($outArray);