Foros del Web » Programando para Internet » PHP »

menor en un arreglo, teniendo en cuenta la diferencia.

Estas en el tema de menor en un arreglo, teniendo en cuenta la diferencia. en el foro de PHP en Foros del Web. Hola, tengo un arreglo con los siguientes datos: 5,10,16,22,30 y tengo un dato 14 entonces, debo tomar este dato 14 e irlo comparando con los ...
  #1 (permalink)  
Antiguo 18/07/2005, 12:02
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
menor en un arreglo, teniendo en cuenta la diferencia.

Hola, tengo un arreglo con los siguientes datos: 5,10,16,22,30

y tengo un dato 14

entonces, debo tomar este dato 14 e irlo comparando con los datos del arreglo e identificar si es menor que uno de los datos del arreglo y a cual se aproxima más...

según los datos que tengo en mi arreglo 14 es menor que 16,22,30 pero necesito, además de saber si es menor, saber a cual de estos datos se apróxima más, es como saber cuál de ellos tiene menor diferencia.. y que asi como resultado.. me diga que el 14 es menor que 16,22,30 pero que se aproxima más al 16.

creo mi arreglo y lo recorro, comparo los menores, pero no logro sacar la diferencia... podrian colaborarme?
  #2 (permalink)  
Antiguo 18/07/2005, 14:13
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
.....
  #3 (permalink)  
Antiguo 18/07/2005, 14:32
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Podés hacer la resta entre el número y el 14 y guardar los resultados en un array siempre que el resultado sea mayor a cero, de lo contrario guardá un caracter, como ser 'z'. Después ordenas el array de menor a mayor. El índice del primer elemento va a ser el índice del número más cercano en el otro array. Me explico mejor...

Tenés dos arrays: numeros y resultados.

Código PHP:
$numeros = array(0=>5,1=>10,2=>16,3=>22,4=>30);
$resultados = array(0=>z1=>z2=>23=>84=>16); 
Ordenás $resultados usando asort:

Código PHP:
$resultados asort($resultados); 
Ahora resultados quedó:

Código PHP:
array(
   
2=>2,
   
3=>8
   
4=>16,
   
0=>z
   
1=>z
); 
y $numeros[key($resultados)] es el elemento que buscas ($numeros[key($resultados)] = $numeros[2] = 16)

No sé si es la forma más eficiente, pero funciona.

Suerte,
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #4 (permalink)  
Antiguo 18/07/2005, 14:51
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mm ok.. grazie... miraré entonces.. pero si tenemos algunas ideas más óptimas.. estaré presta a "escuchar" ...
  #5 (permalink)  
Antiguo 18/07/2005, 15:48
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
por qué me sale error al tratar de imprimir resultados después de ordenarlo??


Warning: Invalid argument supplied for foreach() in D:\eclipse\workspace\prueba\select.php on line 11


Código PHP:
$numeros = array(0=>5,1=>10,2=>16,3=>22,4=>30); 
$resultados = array(0=>z1=>z2=>23=>84=>16);
$resultados asort($resultados); 
foreach( 
$resultados as $key => $value ) {
   echo 
"Key: $key; Valor: $value<br>\n";

  #6 (permalink)  
Antiguo 18/07/2005, 16:06
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 14 años, 1 mes
Puntos: 1
no he seguido todos los mensajes de este post, pero a simple vista si checas la documentación de la función asort() http://www.php.net/asort
verás que asort te devuelve un valor booleano, y tu estás intentando iterar sobre un valor booleano, cosa que es un error. El primer argumento que pasas a la función asort() es una referencia, por lo tanto las modificaciones al array se hacen automaticamente sin necesidad de reasignar el resultado
  #7 (permalink)  
Antiguo 18/07/2005, 16:08
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mmm no entendi.. pero ok, miraré la documentación... gracias.
  #8 (permalink)  
Antiguo 19/07/2005, 02:15
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Es que me confundí al pasarte el código :D

Código PHP:
$numeros = array(0=>5,1=>10,2=>16,3=>22,4=>30); 
$resultados = array(0=>z1=>z2=>23=>84=>16); 
asort($resultados); 
foreach(
$resultados as $key => $value) { 
   echo 
"Key: $key; Valor: $value<br>\n"

Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #9 (permalink)  
Antiguo 19/07/2005, 09:48
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mmm bueno ando como medio complicada con los array...

ahora ya tengo pues array de números... y formo otra array que se llama resultados, con la diferencia.. comparando si dia es menor al número que tengo en el array y si es asi.. pues llevo la diferencia al array resultados y si no.. a ese array resultados le asigno una N...

ahora.. lo ordeno.. y todo hasta ahi va bien...

mm y bueno lo que ahora necesito.. es.. con mi arreglo resultado, saber en que posición esta el menor.. en este caso seria el primero que encuentro sin la n... y a su vez.. saber en que posición del array números.. se generó la menor diferencia.. lo que tendría que obtener como resultado.. es que en la posición 3 del array números... se encontro.. asi la menor diferencia de dia lo tengo con el dia 22 donde la diferencia es 3...

entonces como resumido, necesito la menor diferencia del array resultados, y del array numeros el número con se obtuvo la diferencia... y bueno pues me he liado con estos arrays!!


Código PHP:
$numeros = array(0=>5,1=>10,2=>16,3=>22,4=>30); 
$dia date('d');
foreach( 
$numeros as $key => $value ) {
   if (
$dia $value)
   {
       
$diferencia $value $dia;
       
$resultados[] = $diferencia;
   }else{
       
$resultados[]= "N";
   }
}
asort($resultados); 
$i 0;
foreach( 
$resultados as $key => $value ) {
    echo 
"Valor: $i =>$value\n";
    
$i++;

  #10 (permalink)  
Antiguo 19/07/2005, 12:17
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
No te entendí mucho, pero siguiendo con lo del primer post:
Código PHP:
$numeros = array(0=>5,1=>10,2=>16,3=>22,4=>30); 
$dia date('d'); 
foreach( 
$numeros as $key => $value ) { 
   if (
$dia $value
   { 
       
$diferencia $value $dia
       
$resultados[] = $diferencia
   }else{ 
       
$resultados[]= "N"
   } 

asort($resultados); 
echo 
"El número más cercano a ".date("d")." es ".$numeros[key($resultados)]; 
¿Era eso u otra cosa?

Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #11 (permalink)  
Antiguo 19/07/2005, 12:24
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mm de hecho esa solución que me das no es clara.. mira el resultado que me devuelve como decis es:

echo "El número más cercano a ".date("d")." es ".$numeros[key($resultados)];

y bueno si hoy que hacemos la prueba estamos a 19 el arreglo como lo muestro en mi post imprime un resultado asi

Valor: 0 =>N Valor: 1 =>N Valor: 2 =>N Valor: 3 =>3 Valor: 4 =>11


donde la diferencia realmente es 3. ok, encuentra bien las diferencias.. lo que necesito.. es saber en que posición del arreglo números se encuentra el número que me obtuvo la menor diferencia... mira que viendo los arreglos...

$numeros y $diferencia... en la posición 3 de números tengo el 22 que es el que restad con 19 me da la diferencia de 3, dato que guardo en el arreglo $diferencia en la misma posición... entonces necesito es saber la posición del arreglo $diferencia que tiene mi menor dato, ya ordenado no debe quedar dificil, pues supongo que comparo y pregunto que si es diferente de N y es el primero que encuentro (en teoria). luego de encontrarlo. necesito saber la posición que en $numeros me dio ese resultado.. eso en que parte debo hacerlo.. ?? o como me queda el array?... ahora si fui clara...
  #12 (permalink)  
Antiguo 19/07/2005, 13:49
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Estoy un poco apurado, si no me explico bien a la noche lo arreglo, pero:

key($diferencias) devuelve el índice del elemento actual de $diferencias (vendría a ser el primero) y ese mísmo índice es el índice del elemento que buscas en $numeros. Por lo que creo que el número que necesitas es key($diferencias);

Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #13 (permalink)  
Antiguo 19/07/2005, 13:57
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Ahh el problema es que las letras aparecen antes en el código ASCII y por eso ordena el array con las n adelante. Lo probé así y me funcionó:

Código PHP:
<?php

$numeros 
= array(510162230); 
$dia date('d'); 

foreach( 
$numeros as $key => $value ) { 
   if (
$dia $value)   { 
       
$diferencia $value $dia
       
$resultados[$key] = $diferencia
   } 
}

asort($resultados); 

echo 
"El número mayor a ".date("d")." más cercano es ".$numeros[key($resultados)]." con una diferencia de ".$numeros[key($resultados)]-date("d")." días";

?>
Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #14 (permalink)  
Antiguo 19/07/2005, 14:28
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mm no lo que obtengo es esto:

-19 días

Última edición por Salome; 19/07/2005 a las 15:14
  #15 (permalink)  
Antiguo 19/07/2005, 15:18
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
uu, justo lo de la diferencia no lo probé.
Más tarde voy a probar a arreglarlo.

Suerte,
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #16 (permalink)  
Antiguo 19/07/2005, 17:55
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Y bueno, ahora funciona (creo):

Código PHP:
<?php 

$numeros 
= array(510162230); 
$dia date('d'); 

foreach( 
$numeros as $key => $value ) { 
   if (
$dia $value)   { 
       
$diferencia $value $dia
       
$resultados[$key] = $diferencia
   } 


asort($resultados); 
$dif $numeros[key($resultados)] - date("d");
echo 
"El número mayor a ".date("d")." más cercano es ".$numeros[key($resultados)]." con una diferencia de ".$dif." días"

?>
Ejemplo funcionando: http://fedeblog.com.ar/Untitled-1.php

Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #17 (permalink)  
Antiguo 19/07/2005, 18:03
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
super!! gracias...ahora mismo, me pondré a organizarlo con datos traidos desde mysql, para realizar cobros, dependiendo del ciclo de facturación al que pertenezca un cliente, pero asi es el algoritmo!!!

te debo una cerveza..
  #18 (permalink)  
Antiguo 19/07/2005, 18:18
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
jeje, de nada ;)
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #19 (permalink)  
Antiguo 21/07/2005, 12:26
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
ok, sigo con problemas.. ya estoy realizando consultas a la base de datos, para generar mi primer arreglo, que antes era llamado números y le he cambiado el nombre por ciclos, ese arreglo se forma bien, con los datos que necesito... y bueno, todo funciona, menos el error que me sale en una de las líneas.

Fatal error: Unsupported operand types in D:\eclipse\workspace\gateways\gateways\clientes\Ct rlIngresoCliente.php on line 36

y la líena es esta:

Código PHP:
$dif $ciclos[key($resultados)] - date("d"); 
y este es el código que uso..

Código PHP:
$ciclo = new CtrlIngresoCliente;
    
$ciclos $ciclo->consultarCiclos($cdalianza);
    
$dia date('d'); 
    foreach( 
$ciclos as $key => $value ) { 
       if (
$dia <= $value["NMDIA_INICIO"])   { 
                   
$diferencia $value["NMDIA_INICIO"] - $dia
                     
$resultados[$key] = $diferencia
       } 
    } 
    
asort($resultados); 
    
$dif $ciclos[key($resultados)] - $dia
    echo 
"El número mayor a ".date("d")." más cercano es ".$ciclos[key($resultados)]." con una diferencia de ".$dif." días"
un saludo...

aahh por cierto, estuve realizando pruebas.. y todo va bien.. hasta que intento realizar esta línea...

Código PHP:
$dif $ciclos[key($resultados)] - $dia
y es justo ahi, donde parece estar el error, y pues todavia no entiendo que es lo que sale mal.

Última edición por Salome; 21/07/2005 a las 12:55
  #20 (permalink)  
Antiguo 21/07/2005, 16:39
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Probá hacer un print_r($ciclos); después de $ciclos = ciclo->consultarCiclos($cdalianza); para ver si está funcionando ese método.

También podés hacer echo $ciclos[key($resultados)]; antes de asignar $dif para confirmar que te devuelva el número correcto.

Qué extraño :/
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #21 (permalink)  
Antiguo 21/07/2005, 16:42
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
ok. haré la prueba.. y bueno ya hice otro post.. jajajaja vamos a ver en que resultamos...
  #22 (permalink)  
Antiguo 21/07/2005, 16:51
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
esto obtengo con el print_r($ciclos)

Código:
Array ( [0] => Array ( [0] => 15 [NMDIA_INICIO] => 15 ) [1] => Array ( [0] => 30 [NMDIA_INICIO] => 30 ) )
asi que el método si funciona.

y bueno con print_r($ciclos[key($resultados)]); obtengo esto:

Código:
Array ( [0] => 30 [NMDIA_INICIO] => 30 )
asi que el dia tambien me da.. pues efectivamente es el 30 el más cercano.. pero igual, aunque me queda faltando la diferencia. no funciona al hacer dif.. sale el error que mencione antes.
  #23 (permalink)  
Antiguo 21/07/2005, 16:59
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mira como lo he resuelto, pero no sé si sea lo mejor..


Código PHP:
asort($resultados);
$diainicio_factura $ciclos[key($resultados)];
$dif =  $diainicio_factura['NMDIA_INICIO'] - date('d');
echo 
"El número mayor a ".date("d")." más cercano es ".$diainicio_factura['NMDIA_INICIO']." con una diferencia de ".$dif." días"
y esta es la respuesta:

El número mayor a 21 más cercano es 30 con una diferencia de 9 díasCliente

y bueno.. pues no sale error, y efectivamente el más cercano es el 30.
  #24 (permalink)  
Antiguo 21/07/2005, 17:04
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
acabo de encontrar otro lio..

si el dia no es nunca menor .. es decir.. por ejemplo si no tuviera 30, si no un 18.. entonces 21 nunca va a ser menor que 18.. :-p asi que tengo que hacer es otra cosa.. tengo una fecha de inicio y una fecha de fin... asi que tengo que coger es el dia que ingresa y preguntar si ese dia.. esta entre esos doas dias.. por ejemplo entre 18 y 30 no solo preguntar que si es menor a 18... mmmmm

vaya lio, en mi base de datos, tengo una dia de inicio y un dia de fin.. estos dias son asi.. 18 al 18... asi que no tiene mes.. pero tengo un campo donde digo.. si es 0 es porque es del mes actual y si es 1 es porque el mes siguiente... asi si tengo esto 18 al 18 digo que es un ciclo del 18 de este mes al 18 del mes siguiente.. y si es 30 al 30 y esta en 1 entonces estoy cobrando es el mes siguiente... mmm el cuento es que tendria que armar la fecha para quede asi..

18/07/2005 al 18/08/2005
30/07/2005 al 30/08/2005

y ahi si comenzar a decir.. que si la fecha del dia.. 21/07/2005 esta entre esos valores o es igual a alguno de ellos... entonces pertenece a esos ciclos..

Última edición por Salome; 21/07/2005 a las 18:01
  #25 (permalink)  
Antiguo 21/07/2005, 22:46
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
Ya esto me supera, no entendí nada :S
Explicá todo desde cero cómo tenés las bases de datos y qué es exactamente lo que querés hacer.

Suerte
Fede
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
  #26 (permalink)  
Antiguo 22/07/2005, 11:35
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
mmm a ver.. mmm ando resolviendo parte del embrollo con el query que realizo a la base de datos, apenas tengo algo más concreto.. entonces te cuento..

Gracias..

PD: ah ya te debo dos cervezas!!!
  #27 (permalink)  
Antiguo 22/07/2005, 18:17
Avatar de Salome  
Fecha de Ingreso: noviembre-2002
Ubicación: Colombia
Mensajes: 1.032
Antigüedad: 15 años, 1 mes
Puntos: 1
ok, ya todo quedó resuelto en un query hecho a la base de datos...

en principio, todo funciono con los arreglos.. haciendo el orden, incluso la parte de la base de datos, pero luego el análisis o requerimiento cambio y bueno ahi es donde surgió el enredo.. pero ya resuelto.


Gracias por su colaboración..
  #28 (permalink)  
Antiguo 22/07/2005, 18:34
 
Fecha de Ingreso: febrero-2005
Mensajes: 670
Antigüedad: 12 años, 10 meses
Puntos: 0
uuhh que bueno, la verdad es que ya no entendía nada =P
__________________
Federico H. García
Desarrollo Web
www.federicog.com.ar
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:01.