Foros del Web » Programando para Internet » PHP »

matriz 3x5 niveles forzada

Estas en el tema de matriz 3x5 niveles forzada en el foro de PHP en Foros del Web. Hola Amigos Estoy Creado una matriz forzada con derrame de 3x 5 niveles Un Ejemplo la matriz es de 3 x 5 niveles nivel 1 ...
  #1 (permalink)  
Antiguo 17/11/2013, 23:07
 
Fecha de Ingreso: septiembre-2013
Mensajes: 32
Antigüedad: 10 años, 7 meses
Puntos: 0
matriz 3x5 niveles forzada

Hola Amigos Estoy Creado una matriz forzada con derrame de 3x 5 niveles
Un Ejemplo

la matriz es de 3 x 5 niveles

nivel 1 = 3 referidos
nivel 2 = 9 referidos
nivel 3 = 27 referidos
nivel 4 = 81 referidos
nivel 5 = 243 referidos

esta debe ser forzada es decir ejemplo:

"Usuario-efren" se registra en el sistema el entra a la matriz en el primer nivel debe invitar 3 referidos para llenar su primer nivel.

el invita a "usuario1" , "usuario2" y "usuario3"

Pero si "Usuario-efren" invita a una 4ta persona esa persona ya no va ir en su primer nivel sino en el segundo.
Pero como el ya tiene sus 3 referidos esta 4ta persona debe de sumarsele a su primer referido que es el "usuario1" pero si el "usuario1" ya tiene sus 3 referidos , entonces esta 4ta persona se le colocara al 2 referido de "usuario-efren" que seria el "usuario2" pero si este "usuario2" ya tiene sus 3 referidos, entonces la 4ta persona se le colocara al 3er referido que seria el "usuario3" y si este usuario ya tiene sus 3 referidos entonces esta 4ta persona se le colocara al primer referido de "usuario1" y si este ya tiene sus 3 referidos se sigue el mismo procedimiento

En esta parte es donde tengpo el problema no se como hacer para seguir esta secuencia

Si alguien conoce de esto y me pueda ayudar le agradeceria mucho

Espero haberme explicado bien en el ejemplo

Hasta el primer nivel voy bien pero ya a la 4ta persona no se como hacer
  #2 (permalink)  
Antiguo 24/06/2014, 13:56
(Desactivado)
 
Fecha de Ingreso: junio-2013
Ubicación: Santo Domingo de Guzmán
Mensajes: 35
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: matriz 3x5 niveles forzada

Yo tambien estoy desarrollando un sistema parecido. Aunque aun estoy en pruebas siwmpre es conveniente que estos temas lo hagas primero a mano para despues aplicarlo al código (es como lohago yo).

En este caso yo le aplicaria un campo en la base de datos que seria un codigo de posicion por persona. Es decir:
11 -> nivel 1 referido directo 1
12 -> nivel 1 referido directo 2
13 -> nivel 1 referido directo 3

Entonces...
211 -> nivel 2 referido directo 1 ha traido 1er subreferido
212 -> nivel 2 referido directo 1 ha traido 2o subreferido
213 -> nivel 2 referido directo 1 ha traido 3er subreferido

Y asi hasta llegar al 233

Entonces si todos ellos tienen su primer nivel lleno (para ti es tu 2 nivel) entonces poner al nuevo referido en la posicion...

3211 -> 1er referido del 1er referido de tu referido directo 1.

Como hacer eso? Utilizando un bucle for ... next dento de otro bucle for ... next, tantos bucles como jiveles haya... con ese sistema de bucles iras chequeando la posicion por cada usuario hasta encontrar un hueco libre y ese have eco sera el que se le asigne al nuevo usuario.

Me he explico?
  #3 (permalink)  
Antiguo 24/06/2014, 14:55
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: matriz 3x5 niveles forzada

Hola,

Creo debes leer este tema donde se aclara la estructura de base de datos, con eso claro... ya sabras como hacer lo que preguntas.

Realmente no importa si es de 2x3 o 3x5 ... etc... la estructura y la forma de llenar es la misma!
__________________
Salu2!
  #4 (permalink)  
Antiguo 24/06/2014, 17:50
(Desactivado)
 
Fecha de Ingreso: junio-2013
Ubicación: Santo Domingo de Guzmán
Mensajes: 35
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: matriz 3x5 niveles forzada

Yo sé porqué efren315 ha planteado ese problema, pues yo también trabajo con MLM. El problema no es plantear la base de datos ya que eso es sencillo, simplemente a cada miembro se le asigna el código del patrocinador y listo.

El problema principal, es que el sistema UBIQUE a cada uno en su lugar correspondiente en el sistema teniendo en cuenta que es una matriz FORZADA, si solo fuese una matriz pues con lo que he antes mentado en el primer párrafo es suficiente.

Entonces, es necesario que cada miembro en la matriz se le adjudique una posición dentro de la matriz para que esta sea forzada.

Como quizás con lo que publiqué antes no se haya entendido mejor, adjunto una imagen con la estructura solo hasta un 3er nivel ( ya que si pongo más niveles pues es un coñazo) y con 3 niveles yo creo que ya se capta la mecánica del tema.

[URL="https://www.dropbox.com/s/gm6synasuifzzle/matriz.png"]Ejemplo Id posiciones Matriz 3x3[/URL]

¿Otras ventajas de adjudicar nº posición en la matriz? Pues de esta manera se puede crear un script que dibuje la matriz y teniendo un nº por cada posición sería más sencillo dibujar la matriz.

PD: ¿Cómo hago para que al postear aquí me publique los links correctamente sin que se vean las etiquetas [URL]?

Última edición por cdiazr; 24/06/2014 a las 18:01
  #5 (permalink)  
Antiguo 25/06/2014, 13:25
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: matriz 3x5 niveles forzada

Hola, propongo otra forma diferente de pensarlo a ver que les parece

Las dimensiones de una matriz son de NxM (Para este caso particular de 3x5), ahora bien, toda matriz puede ser transformada a una lista, y por ende toda lista puede ser transformada a una matriz, es un caso particular de re-dimensionamiento de matrices donde una de las matrices tiene una única fila (o columna).

Sabemos que una base de datos puede con una consulta bien armada, retornar fácilmente una lista de valores ordenados la cual con un simple loop, podemos guardar en un array, esto nos permite que podamos ver a un Array de PHP con claves numéricas correlativas como una lista ordenada (Aunque internamente sea una tabla hash...).

Si tenemos en una lista (Array) los datos de los patrocinadores y de los referidos de forma ordenada, tal que, los patrocinadores esten al inicio y luego sus referidos, podemos por lo dicho al principio, convertir esa lista en una matriz de NxM.

¿Y esto como se come? Bueno, vamos al codigo.

Esta primer parte es una carga manual de los patrocinadores y referidos, notese que puede automatizarce con un loop que obtenga resultados de una base de datos
Código PHP:
Ver original
  1. <?php
  2.     // Consideremos al usuario A como el primer eslabón de los referidos.
  3.     // Es decir, como el patrocinador base.
  4.     $listUsrA = ["A"];
  5.  
  6.     // Nota: Si los datos vienen de una base de datos, esto sera solo un loop ya que se pueden obtener de forma simple por sql.
  7.     // Ahora, agregamos a la lista los referidos directos del usuario A.
  8.     $listUsrA[] = "Referido de A - 1";
  9.     $listUsrA[] = "Referido de A - 2";
  10.     $listUsrA[] = "Referido de A - 3";
  11.     $listUsrA[] = "Referido de A - 4";
  12.     // ... Tantos como halla.
  13.     // ... Notese que no interesa la cantidad en ningun momento, solo se agrega uno tras otro.
  14.     // Notese tambien, que estan ordenados, primero los del primer patrocinador, luego los de sus referidos.
  15.  
  16.     // Ahora, de forma ordenada agrego los referidos de los referidos de A
  17.     $listUsrA[] = "Referido de A1 - 1";
  18.     $listUsrA[] = "Referido de A1 - 2";
  19.     $listUsrA[] = "Referido de A1 - 3";
  20.     $listUsrA[] = "Referido de A1 - 4";
  21.     $listUsrA[] = "Referido de A2 - 1";
  22.     $listUsrA[] = "Referido de A2 - 2";
  23.     $listUsrA[] = "Referido de A3 - 1";
  24.     $listUsrA[] = "Referido de A4 - 1";
  25.     $listUsrA[] = "Referido de A4 - 2";
  26.     // ... Tantos como halla y asi siguiendo indefinidamente pero siempre de forma ordenada.

Pueden observar que lo anterior es muy simple de automatizar, el unico punto de importancia es que el referido 3, va despues del referido 2, NUNCA antes, y los mismos sus sub-referidos, primero van los sub-referidos del referido 2 y luego los sub-referidos del referido 3, el orden ascendente es importante.

Ahora vamos a lo interesante, la funcion que pasa la lista a una matriz de NxM:
Código PHP:
Ver original
  1. function listToMatriz($list, $n, $m)
  2. {
  3.     // Nota: Esto puede realizarce perfectamente con un LIMIT en la consulta SQL.
  4.     if(count($list) > pow($n,$m)) // Si hay mas elementos que los que admite la matriz
  5.        $list = array_slice($list, 0, pow($n,$m)); // La trunco.
  6.  
  7.     $levels = []; // Array temporal con los niveles.
  8.     $level  = 0; // Nivel actual.
  9.    
  10.     while($level <= $m) // Mientras estemos en un nivel valido.
  11.     {
  12.         $tmp = array_splice($list, 0, pow($n, $level)); // Obtenemos la parte de la lista que corresponde al nivel.
  13.         if(count($tmp) > $n) // Si hay mas elementos que los que se admiten.
  14.             $tmp = array_chunk($tmp, $n); // Se los parte en grupos.
  15.        
  16.         if($tmp) // Esto es para no generar niveles vacios y ocupar espacio inutilmente, solo se guardan los niveles con datos.
  17.             $levels[] = $tmp; // Agregar el nivel.
  18.            
  19.         $level++; // Incrementar el nivel.
  20.     }
  21.    
  22.     $level = count($levels)-1; // Empezamos a recorrer el arbol por las hojas del ultimo nivel.
  23.    
  24.     while($level > 2) // Los dos primeros niveles son casos particulares y se resuelven juntos despues.
  25.     {
  26.         $grupo = 0; // Por que grupo voy.
  27.         foreach($levels[$level-1] as &$patrocinadores) // Recorro los patrocinadores del nivel anterior.
  28.         {
  29.             $tmp = []; // Aca va a ir la información de cada patrocinador.
  30.             foreach($patrocinadores as $patrocinador) // A cada patrocinador le asigno los referidos del grupo correspondiente.
  31.             {
  32.                 $tmp[$patrocinador] = (isset($levels[$level][$grupo]) ? [$levels[$level][$grupo] => []] : []);
  33.                 $grupo++; // Incrementar el grupo.
  34.             }
  35.             $patrocinadores = $tmp; // Al los patrocinadores lo redefino con sus referidos.
  36.         }
  37.         unset($levels[$level]); // Esto lo libero ya que no se usa mas.
  38.         $level--; // Subo un nivel en el arbol.
  39.     }
  40.  
  41.     // Nivel 0 y Nivel 1.
  42.     $matriz = []; // Crear matriz vacia.
  43.     $matriz[$levels[0][0]] = array_combine($levels[1], $levels[2]); // Resolver ambos niveles de forma particular.
  44.  
  45.     return $matriz; // Retornar la matriz.
  46. }

Esa función pasa la lista a una matriz de NxM, pero como en este caso la matriz es de 3x5 la llamamos asi:
Código PHP:
Ver original
  1. $matriz = listToMatriz($listUsrA, 3, 5); // Finalmente llamamos a la funcion con las dimenciones de la matriz.
  2.  
  3. var_dump($matriz);

Como sin duda ya se percataron, las dimensiones de la matriz son irrelevantes y pueden ser modificadas en cualquier momento, lo unico que queda por saber es.. ¿Como esta formada esa matriz?

La respuesta es:
Cita:
array (size=1)
'A' =>
array (size=3)
'Referido de A - 1' =>
array (size=3)
'Referido de A - 4' =>
array (size=1)
'Referido de A4 - 2' =>
array (size=0)
empty
'Referido de A1 - 1' =>
array (size=0)
empty
'Referido de A1 - 2' =>
array (size=0)
empty
'Referido de A - 2' =>
array (size=3)
'Referido de A1 - 3' =>
array (size=0)
empty
'Referido de A1 - 4' =>
array (size=0)
empty
'Referido de A2 - 1' =>
array (size=0)
empty
'Referido de A - 3' =>
array (size=3)
'Referido de A2 - 2' =>
array (size=0)
empty
'Referido de A3 - 1' =>
array (size=0)
empty
'Referido de A4 - 1' =>
array (size=0)
empty
Es una array, donde las claves de cada nivel corresponden a los patrocinadores y en cada una de esas claves hay un array que contiene a los referidos en el mismo formato.

La funcion tambien puede resolverse por recursividad, pero se me ocurrio plantearla asi, quizas alguien si esta interesado pueda hacerla como para comparar ambos metodos y buscar la exelencia aunque a fines practicos no es muy relevante.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 25/06/2014, 15:07
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: matriz 3x5 niveles forzada

Cita:
Iniciado por cdiazr Ver Mensaje
Como hacer eso? Utilizando un bucle for ... next dento de otro bucle for ... next, tantos bucles como jiveles haya... con ese sistema de bucles iras chequeando la posicion por cada usuario hasta encontrar un hueco libre y ese have eco sera el que se le asigne al nuevo usuario.

Me he explico?
Si tienes n niveles, con un maximo de n queries a la base de datos, conoces la posición.No es necesario un sistema de bucles.
Es más, si en cada usuario guardas el número de personas que ya tiene debajo de ella, con 1 sola query es suficiente.
  #7 (permalink)  
Antiguo 25/06/2014, 15:49
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: matriz 3x5 niveles forzada

Cita:
Iniciado por NSD Ver Mensaje

La funcion tambien puede resolverse por recursividad, pero se me ocurrio plantearla asi, quizas alguien si esta interesado pueda hacerla como para comparar ambos metodos y buscar la exelencia aunque a fines practicos no es muy relevante.
Una forma muy simple de construir ese array,independientemente de la dimension de la matriz , es:
Código PHP:
Ver original
  1. /*
  2.   La clave es el usuario referido, el valor es el usuario padre.Array ordenado segun el usuario padre.
  3. */
  4. /*
  5.   La clave es el usuario referido, el valor es el usuario padre.Array ordenado segun el usuario padre.
  6. */
  7. $assigns=array(
  8.   3=>1,
  9.   2=>1,
  10.   4=>2,
  11.   5=>2,
  12.   6=>2,
  13.   10=>3,
  14.   11=>3,
  15.   12=>3,
  16.   20=>4,
  17.   21=>4,
  18.   22=>4,
  19.   30=>11,
  20.   31=>11,
  21.   32=>12
  22. );
  23.  
  24. $root=null;
  25. $nodes=array();
  26. foreach($assigns as $key=>$value)
  27. {
  28.    // Por definicion, nunca existira $nodes[$key]
  29.    $nodes[$key]=array();
  30.    if(!isset($nodes[$value]))
  31.    {
  32.        $nodes[$value]=array();
  33.        if($root==null)
  34.        {
  35.            // Al estar ordenados por id de usuario, el primero siempre es root.
  36.              $root=array($value=>& $nodes[$value]);
  37.        }
  38.    }
  39.    $nodes[$value][$key]=& $nodes[$key];
  40.    
  41. }
  42. var_dump($root);

Ejemplo en este link

Última edición por dashtrash; 25/06/2014 a las 16:02
  #8 (permalink)  
Antiguo 25/06/2014, 17:17
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: matriz 3x5 niveles forzada

@dashtrash ¡Ojo! que tu funcion no hace lo que que @efren315 necesita!

Lo que hace es armar el arbol de referidos, pero no con forma de matriz forzada, fijate el primer mensaje del tema que es lo que pedia efren porque quizas yo me he expresado mal y te has quedado con una idea erronea del objetivo.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 26/06/2014, 12:55
(Desactivado)
 
Fecha de Ingreso: junio-2013
Ubicación: Santo Domingo de Guzmán
Mensajes: 35
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: matriz 3x5 niveles forzada

Cita:
Iniciado por dashtrash Ver Mensaje
Si tienes n niveles, con un maximo de n queries a la base de datos, conoces la posición.No es necesario un sistema de bucles.
Es más, si en cada usuario guardas el número de personas que ya tiene debajo de ella, con 1 sola query es suficiente.
Sí, no te lo discuto y además yo soy partidario de utilizar la menor cantidad de código y si puedo reducir la cantidad de bucles para realizar una búsqueda pues mejor que mejor.

De todas formas, mi 1ª respuesta a este post la sigo manteniendo para encontrar un sistema que sea sencillo, fácil de programar y funcional utilizando papel lapiz o excel u otro programa que te permita realizar la tarea que se desea manualmente para despues llevarlo a código.

Lo primero es tener claro lo que se quiere hacer, una matriz forzada ya sea la que sea pero forzada, eso consiste en una matriz general que se irá agrandando a medida que los miembros se vayan incorporando y cada miembro genera una matriz forzada FINITA (ya sea 2x3, 3x5, 5x6, etc) mientras que la general es INFINITA (ya que se va agrandando como dije).

Teniendo en cuenta eso, entonces cada posición tiene una ID y que solo faltará asignar un usuario a esa ID de posición.

Entonces como asignar una ID a cada posición? Yo cojí el excel e hice la siguiente estructura...

[URL="https://mega.co.nz/#!bw4wGYAT!EKWQMWSvrHsHats-POeS0NWODf3zXXWTI_hqfA4eupA"]Excel Matriz[/URL]

De esta manera ví mucho más claro como diseñar la tabla.

Código HTML:
[B]Patrocinador      Usuario   id_usuario        id_matriz[/B]
     negocio  	    User1	    1	                   1		
      User1	            User2	    2	                   11
      User1	            User3	    3	                   12
      User2	            User4	    4	                   111
      User3	            User5	    5	                   121
      User2	            User6	    6	                   112
      User1	            User7	    7	                   13
      User7	            User8	    8	                   131
Entonces, con esa estructura de tabla ya sería tan sencillo como buscar a partir de la matriz (usuario) que ha referido el primer hueco vacío para colocar al nuevo miembro.

Por ejemplo:

si el User7 ha sido el último en incorporar un nuevo miembro (User8), pues con solo buscar, a partir de la matriz nº 13, si la matriz nº 131 existe o no y dependiendo el resultado pasar a la siguiente matriz o colocarlo en el 131 que es el caso en el ejemplo de la tabla que he hecho.

Comparto la estructura gráfica de matrizes FINITAS dentro de la matriz general INFINITA para que se mostrar de esta manera cómo el sistema tendría que recorrer la matriz general.

[URL="https://mega.co.nz/#!nkIHhQgI!jxP5tE08Gjwcs9P_oZYlR5lbin322eIKGrAb1O-Ztj0"]Imagen Matriz General[/URL]

Etiquetas: matriz, niveles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:17.