Comunidad de diseño web y desarrollo en internet online

funcion para recorrer una matrix

Citar            
MensajeEscrito el 08 Jun 2015 06:41 am
Hola amigos, escribo por aqui en busca de ayuda, quein pueda por favor.
tengo lo siguiente campos en BD

tb_matrix

campo 1 -> id
campo 2 -> userd_id
campo 3-> parent_id

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ahora estoy tratando de hacer la matriz forzada de la siguiente manera:

tenemos al usuario con ID:

tb_users
campo 1 = ID
campo 2 = username
campo 3 = referer

el ancho de la matriz es 3 " pero puede ser mas o menos " por el momento es 3.

ahora quiero que al usuario afiliar un nuevo miembro este se coloque como su parent_id , esto ya lo tengo, claro siempre que ya este usuario no tenga el limite del ancho que es 3.

me explico:

usuario ID=1 afilia a usuario ID=2 , este ID=2 sera un hijo de ID=1 y lo insertamos en tb_matrix de la siguiente manera:

campo ID = autoIncrement
campo userd_id = colocamos su ID que es 2
campo parent_id = colocamos el id de quien lo refiere en este caso es 1

lo hago con esto:


Código PHP :

// obtengo array 
function db_result_to_array($query) 
{ 
   $result=mysql_query($query); 
   $res_array = array(); 
  
   for ($count=0; $row = @mysql_fetch_array($result); $count++) 
     $res_array[$count] = $row; 
  
   return $res_array; 
} 
  
  
$max_ancho = 3; // el ancho de la matrix 
  
$user_id=mysql_insert_id(); // obtenemos el ID del usuario que se acaba de registrar 
  
// funcion para agregar nuevo usuario// 
  
function agregar_nuevo($user_id){ 
  
$referer=db_result_to_array("SELECT referer FROM tb_users WHERE id=$user_id"); // obtengo el referer 
  
if (!$referer[0][0]){ 
  
// si el usuario no tiene referer procedemos a insertar alguno de los ultimos que se registraron 
  
}else{ // si el usuario si tiene referer buscaremos en la tb_matrix si este tiene espacio o no 
  
$id_referrer = $user_referer[0][0]; // obtengo el id del referer 
$result = incompleto_matrix_users($id_referrer, $max_ancho);  // llamo la funcion para que haga la busqueda en la BD 
} 
$tar_user_id = $result; 
$insert = mysql_query("INSERT INTO tb_matrix (user_id, parent_id) values ('".$user_id."', '".$tar_user_id."')"); 
  
 return $insert; 
  
} 
  
// llamo la funcion para agregar nuevo usuario a la matrix 
  
agregar_nuevo($user_id);  




ahora eso esta bien hasta que me toca llamar la funcion ( incompleto_matrix_users )


Código PHP :

function incompleto_matrix_users($id, $max_ancho){ 
  
       $childs = db_result_to_array("SELECT user_id FROM tb_matrix WHERE parent_id = '$id' "); // obtenemos los hijos 
  
       if (count($childs) < $$max_ancho || !$childs){ // contamos si tiene menos del ancho de la matrix (3) le colocamos el mismo referer 
            return $incomplete_users[] = $id; // asgnamos el mismo referer 
        } 
  
// en caso de que el referer ya tenga 3 referidos procedemos 
  
        for ($i=0; $i < count($childs) ; $i++) { 
  
            return incompleto_matrix_users($childs[$i][0],$max_ancho); // volvemos a llamar la funcion para buscar entre sus referidos del referer 
        } 
  
}  



ok, todo va bien hasta que haciendo pruebas no me percate de que la funcion ncompleto_matrix_users();
hace bien su trabajo solo con el primero de los tres referidos que tiene

me explico mejor:

si el usuario ID=1 afilia un nuevo referido ID=5 llamaremos la funcion para agregar , buscaremos si el usuario ID=1 tiene menos de 3 referidos colocaremos parent_id = 1 hasta aqui bien.

ahora:

usuario ID=1 tiene ya sus 3 referidos que son
usuario ID=2 parent_id=1
usuario ID=3 parent_id=1
usuario ID=4 parent_id=1

como el usuario ID=1 ya tiene sus 3 la funcion va a tomar unos de sus 3 referidos, pero resulta que me devuel al ID=2
pero usuario ID = 2 ya tiene sus 3 referidos que son:
usuario ID=6 parent_id=2
usuario ID=7 parent_id=2
usuario ID=8 parent_id=2

aqui esta el problema que la funcion me devuelve es el usuario ID=6

pero estoy intentando es que me devuelva en caso de que los referidos del usuario ID=1
el ID=2 ya tiene sus 3, entonces busque al usuario ID=3 que es referidos de ID=1, y si en caso de que usuario ID=3
ya tengas sus 3 referidos, busque al tercer referido de Id=1 que seria ID=4 y sino entonces este proceda a buscar en los 3 ref del usuario ID=2, y asi sucesivamente hasta encontrar un espacio, pero quiero que lo haga de esa manera.

todo hasta la profundida que se coloque

si alguien me pueda ayudar seria de mucha ayuda

Por efren315

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Jun 2015 03:54 pm
En resumen tienes

Padre 1
|--- Hijo 1
|--- Nieto 1
|--- Nieto 2
|--- Nieto 3
Padre 2
|--- Hijo 2
|---- Nieto 4
|---- Nieto 5
|--- Hijo 3
Padre 3
|--- Hijo 4

Y quieres obtenerlos así :) hasta el final de la rama de arbol,

Es decir:

Si padre tiene hijos {
.... Leer Hijo
........ Si hijo tiene hijos (nietos)
............. Leer Nietos
Si No tiene hijos, ir al siguiente hijo
Si no hay mas hijos ir al siguiente padre
}

bueno algo asi ¿es lo que quieres obtener? si es así:

id
usuario
id_parent

Si es un padre, no va a tener id_parent,

entonces primero busca a todos los padres, ya que los tienes, ahora busca a los hijos por padre, ya que los tienes (ahora nuevos padres) busca a los hijos (nietos) de cada padre y asi sucesivamente, hasta que un padre ya no tenga hijos :)

podras alcanzar más de 3 niveles ;) saludos

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.