PHP - funcion para recorrer una matrix

   
Vista:

funcion para recorrer una matrix

Publicado por efren (22 intervenciones) el 06/06/2015 02:40:04
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 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($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 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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, 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.

si alguien me pueda ayudar seria de mucha ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

funcion para recorrer una matrix

Publicado por efren (22 intervenciones) el 06/06/2015 18:59:40
Nadien Responde?????
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

funcion para recorrer una matrix

Publicado por xve (5522 intervenciones) el 07/06/2015 09:01:36
Hola Efren, es de esas pregunta un tanto engorrosas de leer, por lo mal tabulado del código, cuesta de ver donde empiezan las funciones y donde terminan...

Si ver tu código, la manera de hacerlo es con una función recursiva que vaya revisando usuario por usuario su matriz hasta dar con algún usuario superior en la pirámide con la matriz vacía.... algo así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function buscarMatrizVacia($idUsuario)
{
	//buscar la matriz de este usuario, y su referido
 
	if(si tiene la matriz llena)
	{
		buscarMatrizVacia($idReferido);
	}else{
		rellenarMatriz($idUsuario);
	}
	return false;
}
?>

Espero que te sirva... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

funcion para recorrer una matrix

Publicado por efren (22 intervenciones) el 07/06/2015 21:59:52
Hola, xve gracias por responder, pero quede igual, si tu podrías hacer la función completa con la busquedad en la bd, xq yo sigo igual, tengo la funcion recursiva

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
		}
 
}


la funcion lo hace , pero solo con el primer referido, y necesito que revise en este caso los 3, pero pueden ser mas o menos.

te explico mejor:

Usuario:

1. Jose
referidos de jose:
1.1 maria
1.2 pedro
1.3 luis

total 3 es decir ya no tiene espacio.

jose acaba de registrar un nuevo usuario lo llamaremos (carlos), al momento de indexarlo a la matrix buscaremos a jose llamando la funcion, esta revisa a jose y nota que ya tiene llena la misma, entonces toma a su primer referidos que es maria y busca y si maria tiene espacio la devuelve, pero en el caso de que maria ya tenga su matrix llena debera tomar a el segundo referido de jose que seria pedro y si pedro la tiene llena busca a luis, y si ni maria, pedro y luis tienen espacio entonces debera buscar a los referidos de maria.

pero resulta que la funcion me salta a pedro y luis, revisa a maria y si maria tiene llena la matriz me toma a los referidos de maria pero no revisa a pedro y luis.

esa es la `parte que me tiene loco, como hago para que revise a:
maria
pedro
luis
y ellos tres ya la tienen llena ahi si pase a buscar los de maria, y sino a los de pedro y asi hasta encontrar espacio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar