Suele ser útil convertir un array simple con datos de una estructura árbol de modelo anidado, como el que se consigue en una consulta a la base de datos, en un array multidimensional. Se utiliza, por ejemplo, para generar listas de html anidadas.
En la web pueden hallarse algunas funciones para tal fin, sobre todo las del tipo recursivas, sin perjuicio de ello, a continuación propongo otra que puede enriquecer lo existente.
Convertir el array a partir de los identificadores por derecha e izquierda
La idea básica para esta función es que si la diferencia entre ambos identificadores de un nodo es mayor que 1, éste será un nodo padre y el siguiente nodo aumentará en uno la profundidad. Por el contrario, si el nodo tiene la id por derecha igual al nodo padre menos 1, éste será el último nodo hijo y la profundidad restará 1. Una aclaración, el valor por derecha es almacenado en un array por comodidad, de lo contrario habría que buscarlo en cada iteración.
function nestedset_to_array($rows)
{
if (empty($rows)) {
return [];
}
$partial = [[]];
$depth = 0;
$right_id = [];
foreach ($rows as $row) {
$row['depth'] = $depth;
$partial[$depth][] = $row;
if (($row['right_id'] - $row['left_id']) > 1) { // the node nests children
$right_id[$depth] = $row['right_id']; // I store the value
$partial[++$depth] = []; // Initialize
} elseif ($depth > 0 && $row['right_id'] == ($right_id[$depth - 1] - 1)) {
$right_id[$depth] = $row['right_id']; // store value
while ($depth > 0 && $right_id[$depth] == ($right_id[$depth - 1] - 1)) { // I start to nest the partial
$i = count($partial[$depth - 1]) - 1;
$partial[$depth - 1][$i]['edge'] = $partial[$depth];
$depth--;
}
}
}
return $partial[$depth];
}
Conclusión
Esta función es más rápida que una recursiva, si bien esto en muchos casos puede despreciarse, también es segura y el código no es muy extenso.