Foros del Web » Programando para Internet » PHP »

Trabajando con array_diff

Estas en el tema de Trabajando con array_diff en el foro de PHP en Foros del Web. Hola es la primera vez que trabajo con esta función y parece ser que soy incapaz de mostrar los resultados a pesar de tener delante ...
  #1 (permalink)  
Antiguo 04/12/2003, 02:15
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Pregunta Trabajando con array_diff

Hola es la primera vez que trabajo con esta función y parece ser que soy incapaz de mostrar los resultados a pesar de tener delante el manual de php que te indica como usarlo, hmm... seguro que es por alguna chorrada pero no consigo detectar el error todo lo que hay antes de aplicarlo funciona correctamente, he comentado el error que me da el array_diff() en el lugar donde lo aplico.

Gracias

Código PHP:
<? 
require 'auth.php';
require_once 
'bd.php';
require 
'reserva.php';
comprueba_autenticacion();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
open
();
$query "SELECT coches.matricula, coches.aparcamiento FROM coches WHERE (aparcamiento = '1')";
$result mysql_query($query) or die(mysql_error());
while(
$vehiculo mysql_fetch_array($result))
$vehiculos[]=$vehiculo;
?> 

<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>
<? foreach($vehiculos as $vehiculo) { ?>
  <tr>
    <td><?=$vehiculo['matricula']?></td>
    <td><?=$vehiculo['aparcamiento']?></td>
  </tr>
<? }?>
</table>

<?php  
open
();
$query "SELECT reserva.matricula, coches.aparcamiento FROM coches INNER JOIN reserva ON
 (coches.matricula = reserva.matricula) WHERE (fecha = '2003-12-30') AND (aparcamiento = '1')"
;
$result mysql_query($query) or die(mysql_error());
while(
$vehiculo2 mysql_fetch_array($result))
$vehiculos2[]=$vehiculo2
?> 
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>
<? foreach($vehiculos2 as $vehiculo2) { ?>
  <tr>
    <td><?=$vehiculo2['matricula']?></td>
    <td><?=$vehiculo2['aparcamiento']?></td>
  </tr>
<? }?>
</table>

<?php 
/* De aquí en adelante aplico el array_diff() y no hay manera de hacerlo funcionar y 
que me muestre los resultados correctamente me da una tabla con que muestra una tabla
con dos filas y dentro aparece el número 8 ¿? */

$resultado array_diff($vehiculo2$vehiculo);
?>

<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>
  </tr>
<? foreach($resultado as $resultado) { ?>
  <tr>
    <td><?=$resultado['matricula']?></td>
    <td><?=$resultado['aparcamiento']?></td>
  </tr>
<? }?>
</table>
</body>
</html>
  #2 (permalink)  
Antiguo 04/12/2003, 03:55
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Hola,

No se si sera este el problema:
Código PHP:
<? foreach($resultado as $resultado) { ?>
Me parece que le estas dando el mismo nombre de variable al array y al elemento, lo que puede que le este produciendo dolores de cabeza a PHP.

Prueba a poner nombres distintos y nos cuentas.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #3 (permalink)  
Antiguo 04/12/2003, 04:19
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola ahora parece funcionar "algo" mejor pero no del todo, me muestra una tablas con sólo la matrícula (y repetida dos veces) y no aparece el valor del parking correspondiente. Pego esa parte del código con las modificaciones (el resto está como antes)

Código PHP:
<?php 
/* De aquí en adelante aplico el array_diff() sólo aparece una matrícula
repetida dos veces y en la columna del aparcamiento no hay ningún valor*/

$resultado array_diff($vehiculo2$vehiculo);
?>

<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>
  </tr>
<? foreach($resultado as $resultado_ok) { ?>
  <tr>
    <td><?=$resultado['matricula']?></td>
    <td><?=$resultado['aparcamiento']?></td>
  </tr>
<? }?>
</table>
  #4 (permalink)  
Antiguo 04/12/2003, 04:30
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Bueno, dentro del foreach supongo que querias referirte al $resultado_ok.

Y por cierto, en el array_diff() usas como parametros $vehiculo2 y $vehiculo, que son los elementos de los arrays $vehiculos2 y $vehiculos. No se exactamente de cuales querias hallar la diferencia.

Lo que podrias hacer es comprobar que $resultado tien el array correcto con:
Código PHP:
echo '<pre>';
print_r($resultado);
echo 
'</pre>'
Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #5 (permalink)  
Antiguo 04/12/2003, 05:01
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola suipongo que cuanta más información os pueda dar será mejor.

En este código tras la consulta con mysql en la primera tabla se muestran 10 elementos, es decir, 1 matrícula y aparcamiento por cada fila (funciona correctamente)

En la segunda tabla se muestra 1 elemento , es decir, 1 matrícula y aparcamiento por cada fila (también funciona ok)

Por lo tanto cuando aplico el array_diff debe de mostrar 9 elementos (según lo que pone en el manual de php).

Bien he colocado lo que has dicho y me da esto

Array
(
[0] => 5433BWW
[matricula] => 5433BWW
)

Además he repasado el código y he depurado un par de errores dentro del array_dif. Pego el código corregido y muestro lo que da (mirar el comentario dentro del código).


Código PHP:
<?php 
/* Me sale una tabla 2x2 con el número 5 en todas las celdas */

$resultado array_diff($vehiculo$vehiculo2);
?>
<?php 
echo '<pre>';

print_r($resultado);

echo 
'</pre>';?>

<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>
  </tr>
<? foreach($resultado as $resultado_ok) { ?>
  <tr>
    <td><?=$resultado_ok['matricula']?></td>
    <td><?=$resultado_ok['aparcamiento']?></td>
  </tr>
<? }?>
</table>
  #6 (permalink)  
Antiguo 04/12/2003, 05:26
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Pues entonces debes poner en array_diff() los arrays, no los elementos:
Código PHP:
$resultado array_diff($vehiculos$vehiculos2); 
Pero puede que no funcione, ya que es un array multidimensional. He hecho un par de pruebas y no consigo que funcione. Y por lo que veo en los comentarios de los usuarios, creo que no funcionara.

Creo que quizas te toque recorrer "a mano" el primer array y seleccionar los que no estan en el segundo.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 04/12/2003, 05:36
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Yo alucino con esto... he puesto lo que me has dicho y me da un array vacío luego he probado con:

Código PHP:
$resultado array_diff($vehiculo$vehiculos2); 
y me dice el chivato que:
Array
(
[0] => 5433BWW
[matricula] => 5433BWW
[1] => 1
[aparcamiento] => 1
)

Cosa que también está mal pero al menos veo que pilla los dos valores ¿? alguna sugerencia más please? realmente ya no se que hacer

Por favor me puedes explicar como hacer eso de:
Cita:
Creo que quizas te toque recorrer "a mano" el primer array y seleccionar los que no estan en el segundo.
El resultado ya lo se (me ha de dar una tabla con 2 columnas y 9 resultados) no se si es a eso a lo que te refieres
  #8 (permalink)  
Antiguo 04/12/2003, 05:49
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Bueno, lo de "a mano" seria algo asi:
Código PHP:
$resultado=array();
foreach (
$vehiculos as $vehi) {
  
$esta=false;
  foreach (
$vehiculos2 as $vehi2) {
    if (
$vehi['matricula']==$vehi2['matricula'] && $vehi['aparcamiento']==$vehi2['aparcamiento']) {
      
$esta=true;
      break;
    }
  }
  if (!
$esta$resultado[]=$vehi;
}
echo 
'<pre>';
print_r($resultado);
echo 
'</pre>'
en lugar del array_diff().

Ojo, el codigo lo he puesto de cabeza. No lo he probado, pero la idea es esta: para cada valor del primer array, decorres el segundo array mirando si coincide con alguno de sus elementos; si no coincide con ninguno, lo añades al resultado.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 05/12/2003 a las 02:15
  #9 (permalink)  
Antiguo 04/12/2003, 17:42
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola, el código funciona de coña Josemi el único problema que me queda es el siguiente:
Me muestra varias tablas ,y en cada tabla aparece una matrícula más que en la anterior hasta que se completan todos los valores del array (matrículas en este caso). Lo único que me falta es saber como poder mostrar todos los valores de este array en una misma y única tabla (y no en varias como ahora me pasa) pego el código a continuación:

Código PHP:
<?php 
$resultado
=array();
foreach (
$vehiculos as $vehiculo) {
  
$esta=false;
  foreach (
$vehiculos2 as $vehiculo2) {
    if (
$vehiculo['matricula']==$vehiculo2['matricula']) {
      
$esta=true;
      break;
  }
  if (!
$esta$resultado[]=$vehiculo;
}
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
  </tr>
<? foreach($resultado as $resultado2) { ?>
  <tr>
    <td><?=$resultado2['matricula']?></td>
  </tr>
<? }?>
</table>
<? }?>
  #10 (permalink)  
Antiguo 05/12/2003, 02:14
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Ups, mea culpa. Se me olvido cerrar una llave en el if. Deberia ser:
Código PHP:
<?php 
$resultado
=array();
foreach (
$vehiculos as $vehiculo) {
  
$esta=false;
  foreach (
$vehiculos2 as $vehiculo2) {
    if (
$vehiculo['matricula']==$vehiculo2['matricula']) {
      
$esta=true;
      break;
    } 
// esta es la que se me olvidaba
  
}
  if (!
$esta$resultado[]=$vehiculo;
}
?>
Espero que ahora funcione bien.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #11 (permalink)  
Antiguo 05/12/2003, 02:39
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Perfecto! por cierto... ¡te debo una birra Josemi! aunque sólo sea de manera virtual
Se nota en estos detalles donde veo claramente que como novato que soy
necesito practicar más, porque a pesar de repasar varias veces el código no vi que faltaba cerrar una llave.

Muchas gracias Josemi y el resto de gente que dominais a saco PHP por tener
tanta paciencia con los que estamos aprendiendo espero poder algún día devolver el favor resolviendo
dudas con la gente que tiene menos nivel (como haceis vosotros) y de manera totalmente altruista
(cosa que tiene el doble de mérito y más en la sociedad en la que vivimos)
  #12 (permalink)  
Antiguo 05/12/2003, 14:44
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Neofito:
También a medida que vas aprendiendo te vas dando cuenta de que hay formas más óptimas de
escribir lo mismo. Ahora mismo por ejemplo te puedo decir que no es necesario hacer un foreach
para escribir en filas los resultados de la consulta. Es suficiente con el while...
Me imagino que el problema se te hizo porque la tabla tiene una fila fija:
"<td>Encabezado</td><td>Aparcamiento</td>" que no quieres que se repita cada vez. Pues eso se
soluciona escribiendo la primera fila (la que te indiqué arriba) antes del bucle while.
Acá te pongo el ejemplo de cómo lo haría yo:
Código PHP:
<?php
open
();
$query "SELECT coches.matricula, coches.aparcamiento FROM coches WHERE (aparcamiento = '1')";
$result mysql_query($query) or die(mysql_error());
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>
<?
while($vehiculo mysql_fetch_array($result)){
    
$vehiculos[]=$vehiculo;
?> 
  <tr>
    <td><? =$vehiculo['matricula']?></td>
    <td><? =$vehiculo['aparcamiento']?></td>
  </tr>
<? }?>
</table>

<?php  
open
();
$query "SELECT reserva.matricula, coches.aparcamiento FROM coches INNER JOIN reserva ON
 (coches.matricula = reserva.matricula) WHERE (fecha = '2003-12-30') AND (aparcamiento = '1')"
;
$result mysql_query($query) or die(mysql_error());
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>

<? while($vehiculo2 mysql_fetch_array($result)){
$vehiculos2[]=$vehiculo2
?> 
  <tr>
    <td><? =$vehiculo2['matricula']?></td>
    <td><? =$vehiculo2['aparcamiento']?></td>
  </tr>
<? }?>
</table>
Saludos
  #13 (permalink)  
Antiguo 05/12/2003, 14:45
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
array_diff()... sí se puede!

Y si se trata de optimizar... y para regresar al origen del tema, el array_diff sí te puede
ser útil en este caso. El problema con array_diff() es que sólo sirve para una dimensión. O sea
que una alternativa puede ser crear arrays de una sola dimensión. Mi alternativa es la siguiente:
Código PHP:
<?php
open
();
$query "SELECT coches.matricula, coches.aparcamiento FROM coches WHERE (aparcamiento = '1')";
$result mysql_query($query) or die(mysql_error());
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>
<?
while($vehiculo mysql_fetch_array($result)){
    
$matricula[]=$vehiculo['matricula'];//Acá está el cambio
    
$aparcamiento[]=$vehiculo['aparcamiento'];//Acá está el cambio
?> 
  <tr>
    <td><? =$vehiculo['matricula']?></td>
    <td><? =$vehiculo['aparcamiento']?></td>
  </tr>
<? }?>
</table>

<?php  
open
();
$query "SELECT reserva.matricula, coches.aparcamiento FROM coches INNER JOIN reserva ON
 (coches.matricula = reserva.matricula) WHERE (fecha = '2003-12-30') AND (aparcamiento = '1')"
;
$result mysql_query($query) or die(mysql_error());
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</a></td>
    <td>Aparcamiento</a></td>

  </tr>

<? while($vehiculo2 mysql_fetch_array($result)){
    
$matricula2[]=$vehiculo2['matricula'];//Acá está el cambio
    
$aparcamiento2[]=$vehiculo2['aparcamiento'];//Acá está el cambio
?> 
  <tr>
    <td><? =$vehiculo2['matricula']?></td>
    <td><? =$vehiculo2['aparcamiento']?></td>
  </tr>
<? }?>
</table>

<?php
//O sea que ahora los arrays son de una dimensión y ya se puede utilizar array_diff()
//Así te ahorras hacerlo "a mano". Bastará con hacer:
$resultado=array_diff($matricula2$matricula);
?>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</td>
  </tr>
<? foreach($resultado as $resultado2) { ?>
  <tr>
    <td><? =$resultado2?></td>
  </tr>
<? }?>
</table>
<? }?>
</body>
</html>
Saludos

Última edición por jpinedo; 05/12/2003 a las 14:47
  #14 (permalink)  
Antiguo 05/12/2003, 15:30
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Bueno, el problema es si quiere eliminar solo los que coincide matricula y aparcamiento a la vez, no solo las matriculas. Como no sabemos exactamente la situacion, es pura especulacion.

Porque tambien si nos fijamos, ambos arrays los saca de consultas. Asi que si queremos eliminar de la primera consulta las matriculas del la segunda consulta, podriamos hacer tambien otra consulta tal como:
Código PHP:
$sql="SELECT SELECT coches.matricula, coches.aparcamiento FROM coches WHERE (aparcamiento = '1') AND matricula NOT IN (".implode(',',$matricula2.")";  // usando el array de jpinedo 
Claro, seria una consulta a base de datos, que puedes decir que consume mas recursos. Pero es otra solucion. ¿Alguien tiene otra?

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #15 (permalink)  
Antiguo 05/12/2003, 16:24
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola, que cosa más rara, tu solución Josemi chutaba de maravilla con la fecha "2003-12-30" cual ha sido mi sorpresa al cambiar el valor por el de $fecha y y veo que al darle otros valores me da siempre un mismo errorl ¿? Me da el error y más abajo me muestra el resultado correcto no se exactamente lo que pasa el error dice:

Warning: Invalid argument supplied for foreach() in C:\GMMD\Apache\Apache2\htdocs\pec1\procesa_reserva me_ya.php on line 38

La línea 38 corresponde a: (la pongo comentada) y pego el código de la página entera por si "se arrastra" algún error.

Por cierto jpinedo los array ahora son de la misma dimendión y he intentado solucionarlo con array_diff y no hay manera

Código PHP:
<? 
require 'auth.php';
require_once 
'bd.php';
require 
'reserva.php';
comprueba_autenticacion();

$aparcamiento $_POST["aparcamiento"]; 
$fecha $_POST["fecha"]; 
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
// MUESTRA TODOS LOS COCHES EN UN DETERMINADO APARCAMIENTO
open();
$query "SELECT coches.matricula FROM coches WHERE (aparcamiento = '$aparcamiento')";
$result mysql_query($query) or die(mysql_error());
while(
$vehiculo mysql_fetch_array($result))
$vehiculos[]=$vehiculo;

// TODOS LOS COCHES EN UN DETERMINADO APARCAMIENTO Y FECHA
open();
$query "SELECT reserva.matricula FROM coches INNER JOIN reserva ON
 (coches.matricula = reserva.matricula) WHERE (fecha = '$fecha') AND (aparcamiento = '$aparcamiento')"
;
$result mysql_query($query) or die(mysql_error());
while(
$vehiculo2 mysql_fetch_array($result))
$vehiculos2[]=$vehiculo2
 
// Código de Josemi
$resultado=array();
foreach (
$vehiculos as $vehiculo) {
  
$esta=false
foreach (
$vehiculos2 as $vehiculo2) { //Josemi esta es la línea 38 donde dice que está el error¿?
    
if ($vehiculo['matricula']==$vehiculo2['matricula']) {
      
$esta=true;
      break;
  }
  }
  if (!
$esta$resultado[]=$vehiculo;
}
?>
<p>Estos son los veh&iacute;culos disponibles para en la fecha <b>
<?=$fecha?></b> y el aparcamiento nº <b>
<?=$aparcamiento?>
</b></p>
<table border=1 cellspacing=0 cellpadding=4>
  <tr>
    <td>Matricula</td>
    <td>&nbsp;</td>
  </tr>
<? foreach ($resultado as $resultado2) { ?>
  <tr>
    <td><?=$resultado2['matricula']?></td>
    <td><a href="reserva_ya_ok.php?fecha=<? echo $fecha?>&matricula=<?=$resultado2['matricula']?>">Reservar</a></td>
  </tr>
<? }?>
</table>

<p>En total hay <b><?=count($resultado); ?></b>
veh&iacute;culo(s) disponible(s).</p>
</body>
</html>
  #16 (permalink)  
Antiguo 05/12/2003, 18:37
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 6 meses
Puntos: 16
Muy sencillo. Foreach necesita que el parametro sea un array. Si no es un array da ese error. Eso quiere decir que $vehiculos2 no es un array. ¿Y por que no es un array? Pues porque la consulta no ha devuelto ningun registro. ¿Como se soluciona? Pues yo lo que hago es inicializar siempre las variables. Asi tendrias que hacer:
Código PHP:
<?php

// MUESTRA TODOS LOS COCHES EN UN DETERMINADO APARCAMIENTO

open();

$query "SELECT coches.matricula FROM coches WHERE (aparcamiento = '$aparcamiento')";

$result mysql_query($query) or die(mysql_error());

$vehiculos=array();  // INICIALIZAMOS $vehiculos a un array vacio

while($vehiculo mysql_fetch_array($result))

$vehiculos[]=$vehiculo;



// TODOS LOS COCHES EN UN DETERMINADO APARCAMIENTO Y FECHA

open();

$query "SELECT reserva.matricula FROM coches INNER JOIN reserva ON

 (coches.matricula = reserva.matricula) WHERE (fecha = '$fecha') AND (aparcamiento = '$aparcamiento')"
;

$result mysql_query($query) or die(mysql_error());

$vehiculos2=array();  // INICIALIZAMOS $vehiculos2 a un array vacio


while($vehiculo2 mysql_fetch_array($result))

$vehiculos2[]=$vehiculo2

 
// Código de Josemi

$resultado=array();

foreach (
$vehiculos as $vehiculo) {

  
$esta=false

foreach (
$vehiculos2 as $vehiculo2) { //Josemi esta es la línea 38 donde dice que está el error¿?

    
if ($vehiculo['matricula']==$vehiculo2['matricula']) {

      
$esta=true;

      break;

  }

  }

  if (!
$esta$resultado[]=$vehiculo;

}

?>
Con esas inicializaciones, en caso de no haber registros y no entrar en los while, $vehiculos y $vehiculos2 todavia serian un array (vacio, pero array).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #17 (permalink)  
Antiguo 05/12/2003, 18:57
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
La leche!! ahora funciona perfectamente y sin problemas. Lo que más me ha gustado es la explicación super transparrente de porque no funcionaba me lo anoto para futuras ocasiones ese truquillo. Muchas gracias Josemi

No se si jpinedo querrá añadir algo más, tal y como he comentado la solución de Josemi funciona de maravilla y la veo menos liosa que utilizando el array_diff que no hay manera de hacerla funcionar (que conste que esla opinión de un novato)
  #18 (permalink)  
Antiguo 05/12/2003, 20:26
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Mmmm sólo tengo una duda... ¿No se supone que se sabe de entrada que todos están en el mismo aparcamiento ($aparcamiento)?... si es así, entonces no hace falta comparar que sean iguales, pues de hecho lo son!... Entonces bastará con comparar la matrícula... y eso sí se puede hacer con array_diff()... y creo que termina siendo más sencillo que escribir toda la comparación.

También concuerdo con la opción de la consulta. Pero si se quiere escribir en pantalla el resultado de las consultas previas (así como lo estaba haciendo neofito en el post original) como ya tenemos todos los datos en arrays no convendría hacer una nueva consulta, sino trabajar con los arrays de la forma que puso josemi o de la mía... igual me sigue pareciendo que mi código es más sencillo, tal vez me faltó explicarlo un poco y por eso neofito se lío.

Ahora que si el tema de escribir los resultados de las consultas previas era simplemente por ilustración y al final no van a ir, lo mejor es hacer una sola consulta a la bd.

Saludos

PD:neofito, prueba con mi código (tal como está) y dime qué parte no te funciona porque a mí me va bien... Si es lo que quieres, pues te lo explicamos mejor y vas a ver que te ahorras mucho con el array_diff().

Ahora, si me equivoqué en lo del aparcamiento (o sea, si no todos tienen el mismo aparcamiento en los resultados)... ignoren mucho de lo que escribí aquí.

Última edición por jpinedo; 05/12/2003 a las 20:28
  #19 (permalink)  
Antiguo 06/12/2003, 02:35
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola,
jpinedo claro que tienen todos el mismo aparcamiento se supone que previamente el usuario ha seleccionado el aparcamiento y la fecha y lo que hace la aplicación es devolver los coches que hay disponibles para esa fecha (que no están reservados) Sabemos previamente que hay 10 coches/aparcamiento y que tenemos 5 aparcamientos.

Lo "ideal" y así es como me lo planteé en un principio era hacer una consulta SQL ya que directamente atacaríamos a la base de datos y php sólo se dedicaría a mostrar los resultados pero creedme he preguntadon foros específicos y nadie se atreve con ella y... los que lo han hecho no han conseguido obtener ningún resultado.

Con lo cual la "otra" solución era cotejar los datos directamente con php que es el script de marras que tenemos por aquí:

Sabiendo previamente la fecha y aparcamiento:
- Array uno: engloba a todas las matrículas de un aparcamiento (10).
- Array dos: engloba las matrículas reservadas (las que haya).

Aplicamos la solución de Josemi y lo que hacemos es pasar los valores no comunes a un array para luego mostrar los resultados. ¡Y funciona de maravilla!
  #20 (permalink)  
Antiguo 06/12/2003, 03:41
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Pero yo sigo pensando que puedes ir optimizando. El hecho que funcione bien no quiere decir necesariamente que lo haga "de maravilla"... Me parece que estás haciendo arrays bidimensionales cuando los puedes hacer unidimensionales.. y que eso te lleva a "reinventar" una función que php incorpora para los de una dimensión... si php tiene una función que hace lo que quieres, creo que es perder el tiempo "reescribirla" (a menos que sea con fines didácticos)...

Por eso defiendo el array_diff() en tu código. Lo que hace el code de josemi en 11 líneas, lo hace array_diff() en una sola.

Prueba el código que te postee y dime si no funciona.. no te cirres en lo primero que sale bien. Ya te he dicho que es mejor ir buscando alternativas óptimas.

Saludos

PD: No es nada personal contra josemi.. yo lo respeto mucho y nadie duda que es un maestrazo acá en los foros... Y seguro ahora regresa con una idea mucho mejor que la suya y la mía juntas xD, xD, xD...
  #21 (permalink)  
Antiguo 06/12/2003, 04:25
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola
jpinedo tu código no me funciona y eso que en teoría utiliza arrays con la misma dimensión no se donde puede estar el error perono memuestra nada hmmm por cierto hablando de optimizar lo más "optimizable" en mi opinión (que conste que soy novato) sería tirar de la consulta de la base de datos (que para eso están) y no hacer sudar al pobre php no?
  #22 (permalink)  
Antiguo 06/12/2003, 19:20
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Por supuesto que lo óptimo es obtener los resultados de una sola consulta a la BD.... en eso estamos de acuerdo todos (creo)...

Pero te repito que te has cerrado en lo primero que funciona... y entre lo de josemi y lo mío... pues mi code es más óptimo. Si josemi te puso eso fue por comparar también el aparcamiento, pero ya que quedó claro que no es necesario... estoy seguro de que él habría hecho algo parecido a lo que hice yo... Al menos por un tema de aprendizaje (curiosidad) deberías tratar de entender lo que hace mi code y por qué no te funciona... (pero eso ya es parte de tu curiosidad, yo no lo puedo inducir)...

Ahora... yo sé poco de SQL, y ayer estuve tratando de buscar la consulta que lo resuelva y no lo conseguí... pero un punto intermedio puede ser algo que creo que ya se dijo antes:

-Hacr la primera consulta y armar uuna lista con las matrículas. Debería generar algo así:
Código PHP:
$lista="(matri1, matri2, matri3, etc...)"
-Hacer la segunda consulta incluyendo
Código PHP:
"... AND reserva.matricula NOT IN '".$lista."'; 
Saludos

Última edición por jpinedo; 06/12/2003 a las 19:34
  #23 (permalink)  
Antiguo 07/12/2003, 14:37
Avatar de neofito  
Fecha de Ingreso: noviembre-2003
Mensajes: 138
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola
jpinedo yo no me cierro en banda con el código de Josemi (de hecho soy novato e intento aprender buenos hábitos de la gente que llevais muchísimo más tiempo que yo programando), la solución de Josemi fue una alternativa que me dió para poderlo hacer sin el array_diff ya que no conseguía hacerlo funcionar de esa manera, lo mejor de todo y después de pelear mucho con el código es que al final he podido hacer lo mismo de dos maneras diferentes porque el código que colgaste aquí al final también lo he podido hacer chutar.

Por cierto la consulta que debería dar el resultado de lo que hace el array_diff y que no me lo da es la siguiente:

SELECT
`coches`.`matricula`
FROM
`coches`
LEFT OUTER JOIN `reserva` ON (`coches`.`matricula` =
`reserva`.`matricula`)
WHERE
(`aparcamiento` = 1) AND
(`fecha` = ('2003-12-30')) AND
(`coches`.`matricula` IS NULL)

Lo que intento con ella es mostrar las matrículas de los coches NO reservados en una fecha y aparcamiento determinados. El caso es que no me devuelve ninguna consulta. Jpinedo la solución última que comentas de hacer una primera consulta y armar una lista con las matrícula y luego hacer una segunda consulta incluyendo a la primera también me parece muy interesante.
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:01.