Ordenar recursivamente la matriz a niveles
-
10-07-2019 - |
Pregunta
He estado trabajando en un sitio que usa un sistema binario de mlm.
Entonces tengo dos tablas en la base de datos, usuarios y relaciones. Hay columnas de identificación y datos personales en los usuarios. Las relaciones tienen 4 columnas: ID, parentID, childID, pos. Donde pos es izquierda o derecha.
He escrito con éxito una función que enumera recursivamente todos los hijos de pid (parentID) dado. Sin embargo, necesito ordenarlo en niveles (para fines de visualización y cálculo).
Tengo una matriz de hijos de ID de usuario = 1:
Array
(
[0] => Array
(
[id] => 2
[parentID] => 1
[pos] => l
)
[1] => Array
(
[id] => 4
[parentID] => 2
[pos] => l
)
[2] => Array
(
[id] => 8
[parentID] => 4
[pos] => l
)
[3] => Array
(
[id] => 5
[parentID] => 2
[pos] => p
)
[4] => Array
(
[id] => 3
[parentID] => 1
[pos] => p
)
[5] => Array
(
[id] => 6
[parentID] => 3
[pos] => l
)
[6] => Array
(
[id] => 7
[parentID] => 3
[pos] => p
)
)
Ahora tengo una función llamada get_levels que devuelve una matriz multidimensional que debería verse así:
Array
(
[0] => Array
(
[0] => Array
(
[id] => 2
[parentID] => 1
[pos] => l
)
[1] => Array
(
[id] => 3
[parentID] => 1
[pos] => p
)
)
[1] => Array
(
[0] => Array
(
[id] => 4
[parentID] => 2
[pos] => l
)
[1] => Array
(
[id] => 5
[parentID] => 2
[pos] => p
)
[2] => Array
(
[id] => 6
[parentID] => 3
[pos] => l
)
[3] => Array
(
[id] => 7
[parentID] => 3
[pos] => p
)
)
ETC.
)
Aquí está la función:
function get_levels($pid,$level, $level_id){
$children = children_array($pid,1);
if (sizeof($children) > 0):
foreach ($children as $child):
if ($child["parentID"] == $pid):
get_levels($child["id"], $level, $level_id+1);
$level[$level_id][] = $child;
endif;
endforeach;
endif;
return $level;
}
function children_array ($ pid, $ depth) devuelve los hijos ... por $ profundidad = 1 devuelve hijos inmediatos (0 o 1 o 2), por $ profundidad = 0 devuelve todos los hijos
¿Alguien puede ayudarme con esta función? Creo que la función funciona, sin embargo, no sé cómo usarla recursivamente y agregarla a la matriz.
Solución
Parece que está utilizando una estructura de datos dentro del contexto incorrecto. Es un árbol binario, pero está representado en una matriz multinivel que, en resumen, no define sus límites y reglas de uso.
Al usar el árbol, usaría algo como una clase Node que tiene dos hijos, izquierdo y derecho. Iterar a través del árbol sería pan comido, insertarlo / eliminarlo / editarlo se realiza fácilmente según el conjunto de reglas que desee seguir. Al almacenar el árbol, usaría algún tipo de Lista de Ahnentafel que se puede hacer fácilmente en una base de datos relacional.
De ninguna manera mezclaría los procesos de iteración y almacenamiento porque si cambio las reglas de almacenamiento, también podría tener que cambiar las reglas de iteración y viceversa.