Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Convertir array multidimensional en diagrama de red

Estas en el tema de Convertir array multidimensional en diagrama de red en el foro de PHP en Foros del Web. Saludos, Quisiera saber como puedo recorrer un arraymultidimensional asociativa para transformarlo en un diagrama, o lo que es lo mismo una estructura de red de ...
  #1 (permalink)  
Antiguo 06/02/2017, 20:49
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Convertir array multidimensional en diagrama de red

Saludos,

Quisiera saber como puedo recorrer un arraymultidimensional asociativa para transformarlo en un diagrama, o lo que es lo mismo una estructura de red de personas.

Tengo un script que construye el array de la manera que uno desee en la configuración. Un solo nivel, varios niveles, con limitación de personas por nivel, sin limitacion de personas por nivel ni limitacion de niveles, etc...

Cuando se configura una limitacion de niveles se me hace facil pues sé cuántas veces he de recorrer el array hasta llegar al ultimo nivel, pero el problema surge cuando no existe tal limitacion.

Podria hacer un loop que se repita hasta 1000 veces y asi cubriria todos los niveles ya que es muy complicado llegar a los 1000, pero lo considero una mala práctica y quisiera saber si hay alguna otra manera para que cuando detecte que exista un array dentro de otro, acceda a ese nivel, lo recorra a lo ancho y que si detecta otro nivel hago lo mismo y así hasta que llegue al ultimo que hay.

El array es asociativo, asi que dentromde todos los campos de cada registro, hay uno de ellos que es el que contiene el array del siguiente nivel.

Ejemplo:
Código PHP:
array(
    array(
        
'Nombre' => 'Perico',
        
'Referidos' => array(
             
'Nombre' => 'Perico Hijo',
             
'Referidos' => array(
                   
'Nombre' => 'Perico Nieto',
                   
'Referidos' => '',
             ),
        ),
    ),
    array(
        
'Nombre' => 'Pascual',
        
'Referidos' => array(
             
'Nombre' => 'Pascual Amante',
             
'Referidos' => '',
        ),
    )

Y así hasta niveles que no se podrian llegar a saber si no se establece un limite.

Estoy cerca de resolverlo, pero necesitaria un empujoncito porque el tema me tiene un poco cansado.

Gracias
  #2 (permalink)  
Antiguo 06/02/2017, 20:53
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Convertir array multidimensional en diagrama de red

Y el código, porque si necesitas un empujon es porque tienes algo hecho, agrega ese código!
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 06/02/2017, 21:11
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Ese codigo no sirve, solo hace una consulta a los datos del miembro principal y una consulta a los referidos si los encuentra. No sirve para ir más a fondo sin tener una cantidad fija de niveles.
  #4 (permalink)  
Antiguo 06/02/2017, 21:15
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Convertir array multidimensional en diagrama de red

Huy, pues te toca esperar entonces. Suerte amigo!
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 06/02/2017, 21:26
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Cita:
Iniciado por hhs Ver Mensaje
Huy, pues te toca esperar entonces. Suerte amigo!
Gracias de todas formas amigo, aunque no creo que espere mucho, no es complicado de entender. Con el ejemplo de array se puede idear ya algo, lo que me ocurre que yo le he dado tantas vueltas que no sé como hacerlo. Incluso probé en un bucle que se llama a si mismo cada vez que detecta u array pero no me construye el array correctamente y menos, siendo asociativo.
  #6 (permalink)  
Antiguo 07/02/2017, 08:56
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Convertir array multidimensional en diagrama de red

Yo creo que sí vas a tener que esperar un buen rato, porque, aparte de que no proporcionas tu código, tampoco un ejemplo de lo que quieres obtener y será difícil adivinarlo.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 07/02/2017, 10:49
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Cita:
Iniciado por Triby Ver Mensaje
Yo creo que sí vas a tener que esperar un buen rato, porque, aparte de que no proporcionas tu código, tampoco un ejemplo de lo que quieres obtener y será difícil adivinarlo.
Lo que trato de hacer es de construir el array como el que compartí, tengo todos los datos en la base de datos y deseo construir el array para que cuando esté terminado, pase el script que se encarga de dibujar el diagrama leyendo la totalidad del array para poder dibujar la estructura.

Compartiré el código pero no creo que os sirva de mucho:

Código PHP:
 private function getMemberData($field$value
    {
        
$select = ['id''Matrix''FirstName''EntityTypeID''Active''Sponsor'];
        
$this->join('members''entities''EntityID''id''LEFT');
        
$this->where($field$value);
        
$result $this->get(self::TB_USERS$selectnull);

        
# If we got more than 1 member, we're getting referrers
        
if(count($result) > 1) {
            
$array = [];
            foreach(
$result as $member) {
                
$array[(string) $member['Matrix']] = $member;
            }

            return 
$array;
        }

        return 
$this->get(self::TB_USERS$selectnull)[0];
    } 
Eso me construye un array de dos niveles, donde el primero solo sale el miembro principal y en el segundo los miembros que existan en ese nivel, a partir de ahi ya no sé como bajar más para que el foreach guarde referidos en en los nuevos niveles (si existen referidos) y así hasta que no hayan más.

Si no se me entiende con lo del diagrama, dejo una captura.
http://prntscr.com/e5pmic

Última edición por Triby2; 07/02/2017 a las 10:55
  #8 (permalink)  
Antiguo 08/02/2017, 13:07
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Voy a preguntarlo de otra manera a ver si alguien entiende el problema real...

Si tu tienes un array con categorias y subcategorias en la base de datos, cómo harías para que, mediante php, pudieras añadir una o varias sub-sub-subcategoria dinamicamente en caso de que tuvieras que crearla.

Es decir, como harias, dinamicamente que se añada otro nivel a ese array. O sea, añadir el [] a $array[][] o más dependiendo de los niveles de subcategorías que necesites crear.
  #9 (permalink)  
Antiguo 08/02/2017, 21:37
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Convertir array multidimensional en diagrama de red

Yo uso una estructura muy diferente, pero que me permite recorrer el array estando en cualquier punto, por supuesto, siempre que cada elemento tenga definido su padre y hace tiempo compartí la idea en: http://www.forosdelweb.com/f18/categ...7/#post4626035

El resultado no es como lo deseas, pero no creo que tengas problemas para generar el diagrama.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 09/02/2017, 07:13
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Cita:
Iniciado por Triby Ver Mensaje
Yo uso una estructura muy diferente, pero que me permite recorrer el array estando en cualquier punto, por supuesto, siempre que cada elemento tenga definido su padre y hace tiempo compartí la idea en: http://www.forosdelweb.com/f18/categ...7/#post4626035

El resultado no es como lo deseas, pero no creo que tengas problemas para generar el diagrama.
Voy a implementar tu método y te dejo saber en cuanto tenga el resultado... bueno, más bien te publicaré el resultado que me dé, recientemente le añadí hasta 100 usuarios y el nivel más profunco (creo) un 6º nivel.
  #11 (permalink)  
Antiguo 09/02/2017, 08:11
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Disculpa Triby, pero la función de recursividad que ahi propones no la logro implementar con éxito ya que esa función está escrita de manera "suposición".

Código PHP:
funcion verCategorias(padre 0) {
      foreach(
categorias[padre] as id) {
            print 
categorias['todos'][id]['nombre']
            
// Revisar si la categoría tiene hijos
            
if(isset(categorias[id])) {
                     
verCategorias(id)
            }
      }

Este es parte de mi array que consigo de la manera que tu especificas:

Código:
$members = Array
(
    [todos] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => cdiazr
                    [Sponsor] => 
                )

            [1] => Array
                (
                    [id] => 2
                    [name] => sarahg
                    [Sponsor] => 1
                )

            [2] => Array
                (
                    [id] => 3
                    [name] => ygn
                    [Sponsor] => 1
                )

            [3] => Array
                (
                    [id] => 4
                    [name] => oscar
                    [Sponsor] => 2
                )

            [4] => Array
                (
                    [id] => 5
                    [name] => usu5
                    [Sponsor] => 4
                )

            [5] => Array
                (
                    [id] => 6
                    [name] => usu6
                    [Sponsor] => 4
                )

            [6] => Array
                (
                    [id] => 7
                    [name] => usu7
                    [Sponsor] => 4
                )
Y aquí tu función de recursividad como yo entiendo que tendría que ser (a partir de la que compartiste) pero no me funciona, obviamente no lanza nada, página en blanco:

Código PHP:
function verCategorias($id 0) {
    global 
$members;
    foreach(
$members[$id] as $id) {
        print 
$members['todos'][$id]['name'];
        
// Revisar si la categoría tiene hijos
        
if(isset($members[$id])) {
            
verCategorias($id);
        }
    }

He tenido que añadir global pq no le pasas por ningún la el array principal, dentro de foreach.
$members[$id] no existe pues hay que poner el ['todos'] antes y ni así me lanza nada.
  #12 (permalink)  
Antiguo 09/02/2017, 22:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Convertir array multidimensional en diagrama de red

El problema es que el índice para cada elemento en "todos" debe ser el campo id. Para generar el array sería algo como:

Código PHP:
Ver original
  1. // Creas el array
  2. $members = array('todos' => array());
  3. while($row = /* instrucción para leer la consulta */) {
  4.     // Agregas en 'todos'
  5.     $members['todos'][$row['id']] = $row;
  6.     // sponsor debe ser numérico para evitarte problemas, aunque sea cero
  7.     $sponsor = (int) $row['sponsor'];
  8.     // Verificas que exista el padre, o lo creas
  9.     if(!isset($members[$sponsor])) {
  10.          $members[$sponsor] = array();
  11.     }
  12.     // Solo necesitas la ID
  13.     $members[$sponsor][] = $row['id'];
  14. }

Te debe quedar algo como:
Código:
$members = Array (
	[todos] => Array ( 
		[1] => Array (
			[id] => 1
			[name] => cdiazr
			[Sponsor] => 
		)
		[2] => Array (
			[id] => 2
			[name] => sarahg
			[Sponsor] => 1
		)
		[3] => Array (
			[id] => 3
			[name] => ygn
			[Sponsor] => 1
		)
		[4] => Array (
			[id] => 4
			[name] => oscar
			[Sponsor] => 2
		)
		[5] => Array (
			[id] => 5
			[name] => usu5
			[Sponsor] => 4
		)
		[6] => Array (
			[id] => 6
			[name] => usu6
			[Sponsor] => 4
		)
		[7] => Array (
			[id] => 7
			[name] => usu7
			[Sponsor] => 4
		)
	)
	[0] => array(1)
	[1] => array(2, 3)
	[2] => array(4, 5, 6, 7)
)
Con esto y el global $members ya te debe funcionar correctamente.
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 12/02/2017, 12:22
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Convertir array multidimensional en diagrama de red

Muchas grácias triby, después de unos pequeños añadidos a la función, pude crear el diagrama y ahora ya comienzo el trabajo para que se cree el diagrama a partir del usuario logueado en el sistema.

Te comparto, como agradecimiento, una captura de toda la estructura completa, desde el miembro principal, tal como quedó con un poco de html y css.

Imagen en OneDrive Cloud

Etiquetas: arrays, diagrama, multidimensional
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 01:31.