Foros del Web » Programando para Internet » PHP »

Recorer Matriz multimensional asociativa

Estas en el tema de Recorer Matriz multimensional asociativa en el foro de PHP en Foros del Web. Hola mi pregunta es la siguiente. Si hago una consulta a una base, esta arroja una tabla. Ahora comunmente para impimir los resultados hago esto: ...
  #1 (permalink)  
Antiguo 29/10/2008, 10:51
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Recorer Matriz multimensional asociativa

Hola mi pregunta es la siguiente. Si hago una consulta a una base, esta arroja una tabla. Ahora comunmente para impimir los resultados hago esto:

Código PHP:
while($r=mysql_fetch_assoc($sql)){
echo
'
<tr>
<td>'
.$r['nombre'].'</td>
<td>'
.$r['apellido'].'</td>
<td>'
.$r['pais'].'</td></tr>';

Ahora ahi se hace el mysql_fetch_assoc antes del while mi pregunta lo asocio antes como lo recorro despues?

Código PHP:
$r mysql_fetch_assoc($sql); 
Y ahora como recorro el $r y hacer lo mismo que arriba, y no asocialarlo dentro de la condicion del while

Gracias de antemano.
  #2 (permalink)  
Antiguo 29/10/2008, 11:00
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Holas!

Podrías hacerlo con un do{}while . . .

Código:
$r=mysql_fetch_assoc($sql);

do {
// ...
} while ($r=mysql_fetch_assoc($sql));
El problema es que si la SQL no devuelve un resultado el bucle te puede fallar . ..

Un saludo!
  #3 (permalink)  
Antiguo 29/10/2008, 11:08
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Gracias por la ayuda, ni idea que era con el do while.

Probe con el for, for each, while simple. Pero nada.

Y no te preocupes antes de asociarlo a $r

Pregunto
Código PHP:
if (mysql_num_rows($sql)==0){
echo
' No hay ningun resultado que mostrar';
die();

Gracias.
  #4 (permalink)  
Antiguo 29/10/2008, 11:31
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

Podés usar mysql_data_seek y luego hacer el while...lo que no nos contás es el porque de esta asignación fuera del while...
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #5 (permalink)  
Antiguo 29/10/2008, 12:21
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Lo que pasa es una consulta con un LEFT JOIN, donde se hace una relacion Uno a Varios, entonces lo asocio primero para escribir valores en unos encabezadas (Como es uno varios, el lado varios hara que se dupliquen los resultados del lado uno), y da igual, porque el valor que quiero escibir una vez esta en cualquier registro. y despues escribir los detalles de los otros campos.

Saludos.
  #6 (permalink)  
Antiguo 29/10/2008, 12:37
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

Personalente para eso hago dos consultas, es más rápido que cruzar dos tablas (y más con un left join, el cual no comprendo para el caso...porque habría datos en la iteración que podrían estar vacios), además estas trayendo un dato redundante que pesa a la memoria del proceso.

En fin, podes optimizarlo así (si el caso aplica, que seguramente lo hace) o bien usar mysql_data_seek para adaptar tu lógica y que funcione.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #7 (permalink)  
Antiguo 29/10/2008, 12:52
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Bueno si es asi, podria optimizarse. Recien aprendo. Aver aprovecho para preguntarte algo,

Que es mejor hacer una
1)Consulta con Joins y Union, para verificar si un usario esta en una lista de empresas.Que vota una lista de empresas y un campo que dice si el usuario esta o no en la empresa
2) Mientras recorro la lista de empresas ir a verificar en otra tabla si el usuario esta o no en la empresa actual.

Gracias.
  #8 (permalink)  
Antiguo 29/10/2008, 13:41
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

Tu pregunta no es muy técnica, no sé que dato necesitas obtener. Si es solo saber si el usuario está relacionado a una determinada empresa, la mejor consulta tal vez pueda ser:

Código PHP:
 
$sql 
"
Select 
    1
from
    usuarios u 
where 
    u.id = '{$tu_var_id_usuario}'
    and exists ( select 1 from usuarios_empresas where usuario = u.id and empresa = '{$tu_var_id_empresa}' )
"
;
$r mysql_query($sql);
echo 
$rs mysql_fetch_row($r)  ? 'Si, existe' 'No, no existe'
Pero obviamente no solo estoy imaginando tu estructura sino que también estoy imaginando el caso.
__________________
Mi punto de partida es Que Bueno Lo Nuevo

Última edición por nicolaspar; 29/10/2008 a las 13:46
  #9 (permalink)  
Antiguo 29/10/2008, 14:19
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Bueno gracias por responder te comento mas o menos. Yo recien empiezo asi tengo dudas.

La estructura es esta:

Tabla e: (empresas)
ID --> Primary Key
nombre

Tabla u: (usuarios)
ID --> Primary Key
nombre

Tabla ue:
ID_E --> Foreign Key
ID_U --> Foreign Key

Basicamente esa, ahora quiero mostrar la lista de todas las empresas, y ademas un campo que diga si el usuario esta o no en cada una de las empresas.

Lo que hago ahora, una sola consulta sql:

Código PHP:
$id_u 2//Ejemplo
$sql mysql_query("
SELECT e.Nombre, "
Si" AS Existe
FROM e
LEFT JOIN ue ON e.ID = ue.ID_E
WHERE ue.ID_U =$id_u
GROUP BY e.Nombre
UNION SELECT e.Nombre, "
No" AS Existe
FROM e
WHERE e.ID NOT
IN (
SELECT ue.ID_E
FROM ue
WHERE ue.ID_U =$id_u
)"
); 
Y funciona, en el primer select hay un gropu by que no duplique por la relacion de la tabla e y ue (uno a varios)
y bueno los escribo:

Código PHP:
if (mysql_num_rows($sql)==0){
echo
' NO hay empresas';
die();
}
echo
'<table><tr>
<td>Empresa</td>
<td>Estas aqui?</td>
</tr>'
;
while (
$f=mysql_fetch_assoc($sql)){
echo
'
<tr>
<td>'
.$f['Nombre'].'</td>
<td>'
.$f['Existe'].'</td>
</tr>'
;
}
echo
'</table>';
mysql_free_result($sql); 
O la otra que estaba pensando es llamar las empresas y cada que recorre verificar si el usuario existe asi:

Código PHP:
$id_u 2;
$sql mysql_query("
SELECT e.ID as i,e.Nombre as n FROM e"
);
if (
mysql_num_rows($sql)==0){
echo
' No hay Empresas';
die();
}
echo
'<table><tr>
<td>Empresa</td>
<td>Estas aqui?</td>
</tr>'
;
while (
$f=mysql_fetch_assoc($sql)){
$aqui "Si";
$q mysql_query("
Select ue.Id_u FROM ue WHERE ue.ID_U = $id_u AND ue.ID_E = $f['i']"
);
if (
mysql_num_rows($q)==0){$aqui 'No'}
mysql_free_result($q)// Libero $q Aqui?, o fuera del bucle?
echo'
<tr>
<td>'
.$f['Nombre'].'</td>
<td>'
.$aqui.'</td>
</tr>'

}
echo
'</table>'
mysql_free_result($sql); 
Bueno ojala me hayas entendido. Y la pregunta cual es mas optimo?, bueno esa de liberar "$q" dentro o fuera del bucle.

Gracias y disculpa haberlo hecho tan largo.
  #10 (permalink)  
Antiguo 29/10/2008, 14:26
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

La segunda opción es mucho mejor que la que estás usando, igual, fijate si te gusta ésta:

Código PHP:
$sql "
Select 
    e.*,
    ifnull((select 1 from ue where ID_E = e.ID and ID_U = '{$id_del_usuario}' limit 1),0) existe
from
    empresas e
"

__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #11 (permalink)  
Antiguo 29/10/2008, 14:54
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Muchisimas Gracias por respoder, cuando intento usar lo que me decis me da que no reconoce la sintaxis. el mysql.

Asi lo escribo:

Código:
SELECT e . * , IFNULL( (

SELECT ID_U
FROM ue
WHERE ID_E = e.ID
AND ID_U =2
), 0 ) AS existe
FROM e;
Igual usare la que plantee. Pero tengo una ultima duda
El

mysql_free_result
Lo ejectuo Dentro o fuera del bucle?

Gracias de antemano.
  #12 (permalink)  
Antiguo 29/10/2008, 15:03
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

Fuera del bucle. Que versión de MySql tenés? (Hace un select version() en phpmyadmin o algún soft que corra contra MySql para saberlo). Si es menor a 4.1 no soportará subselects, pero podés usar dos consultas, una con el select * from empresas, y dentro de la iteración de ésta ejecutas la otra (el subquery) de manera independiente reemplazando el e.ID por el $rs['ID'] y sacándole el ifnull().

Saludos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #13 (permalink)  
Antiguo 29/10/2008, 15:15
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

Mi version es :
5.0.51, de todas maneras no hay pena, me sacaste la duda

muchisimas gracias.
  #14 (permalink)  
Antiguo 29/10/2008, 17:04
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 19 años, 5 meses
Puntos: 34
Respuesta: Recorer Matriz multimensional asociativa

A tu problema...lo único que se me ocurre que hayas hecho literalmente "SELECT e . *", y eso estaría MUUUY MAAL, debería ser "SELECT e.*". Si no entendés mucho sql usá el código tal cual te lo he dado.

Saludos.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #15 (permalink)  
Antiguo 29/10/2008, 18:17
 
Fecha de Ingreso: septiembre-2008
Mensajes: 53
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Recorer Matriz multimensional asociativa

La verdad no se que sera, entiendo SQL y he probado sin asterisco, llamando un solo campo. Y
Probe el subselect por separado y funciona, pero al momento de entrar en la otra da el erro de sintaxis, inclusive probe subselect mas simples, pero sigue sin funcionar. Pero no te preocupes, por el momento quedo bien con la segunda opcion.


Saludos.
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 11:16.