Pregunta

He estado trabajando en un sitio que usa un sistema binario de mlm.

Ilustración aquí

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top