Foros del Web » Programando para Internet » PHP »

array de novata

Estas en el tema de array de novata en el foro de PHP en Foros del Web. Hola a todos. Estoy empezando con el PHP y la verdad, me doy cuenta de que todavía tengo que aprender mucho, así que os cuento ...
  #1 (permalink)  
Antiguo 31/05/2010, 15:00
 
Fecha de Ingreso: mayo-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 2
array de novata

Hola a todos. Estoy empezando con el PHP y la verdad, me doy cuenta de que todavía tengo que aprender mucho, así que os cuento mis desgracias y a ver si podeis ayudarme.
Tengo tres cadenas de números separadas por comas:
23,45,64,76,54,23,76,89,76,59

1,1,1,1,34,56,1,67,1,45

23,45,65,78,99,23,76,89



El primero y el segundo siempre tienen el mismo numero de elementos y están guardados en un campo de una base de datos. además están realacionados entre ellos así al primer elemento de uno, le corresponde el primero de otro, al segundo, el segundo...(23,1), (45,1), (64,1)...(59,45)
Lo que trato de hacer es lo siguiente, recibiendo la tercera cadena tengo que crear otra cadena que actualice la cadena dos.
Es decir, ver que numeros han cambiado entre la tres y la uno, si no ha cambiado se mantiene el valor el la cadena 2 y si ha añadido se inserta un 1 (el 23 tendría el mismo valor, el 45 tambien...el 78 que no estaba debería insertar un 1)

Se me ocurrió hacer un explode a los tres array y comparar los valores de primero y tercero e ir creando una nueva variable con los valores para el segundo.
Resulta que con mi código se insertan 1 por todos los lados en el momento en que encuentra una "no copincidencia".
La teoría es fácil... la práctica es bastante más dificil
Os dejo el código que tengo y gracias a todos por la ayuda
Código PHP:
$tar=explode(","$tarifas['cad']);// cadena tres de valores
$caracAnteriores=explode(","$tar['anterior']);// cadena 1 anterior
$comp$_POST['comp'];// cadena nueva
if(count($tar)>count($comp)){// busco cual es mas larga
$mayor=count($tar);
   }else{
$mayor=count($comp);
}
for(
$i=0$i<$mayor$i++){
   if(
$comp[$i]==$caracAnteriores[$i]){
      
$resultado.=",".$tar[$i];// si es igual uno el valor anterior
   
}else{
      
$resultado.=",1"// si no es igual pongo un uno
      
for($j=$i$j<$mayor$j++){// miro las siguientes
         
if($comp[$i]==$caracAnteriores[$j]){
         
$resultado.=",".$tar[$j];// si coincide pongo su valor anterior
     
}
  }
}
}
echo 
$resultado

Última edición por pennyjou; 31/05/2010 a las 15:16 Razón: mal escrito...
  #2 (permalink)  
Antiguo 31/05/2010, 15:07
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: array de novata

Hola
Bueno, pues te falta cerrar el último for o el último if que tienes!!
corrige eso, tal vez con eso te funcione
sin embargo pruebo y comento, saludos

p.s:

Hice estas asignaciones, estan bien??
//Asignaciones directas
$tarifas['cad'] = '23,45,65,78,99,23,76,89';
$_POST['comp'] = '1,1,1,1,34,56,1,67,1,45';
$tar['anterior'] = '23,45,64,76,54,23,76,89,76,59';

o $_POST['comp'] llega como un arreglo de una vez???

Leyendo un poco mas detenidamente tu post, dices que todos tienen su pareja
entre cadena1 y cadena2, pero en el proceso que comentas, solo actualizas cadena2,
y cadena1 imagino también se debe actualizar correcto???

bueno, me comentas
saludos

Última edición por mortiprogramador; 31/05/2010 a las 15:23
  #3 (permalink)  
Antiguo 31/05/2010, 15:15
 
Fecha de Ingreso: mayo-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 2
Respuesta: array de novata

ups! no, no me falta... es que me lo he dejado sin escribir aquí jejjeje Yalo he puesto y he puesto el echo porque realmente me muestra los resultados... pero mal.


Código PHP:
$tar['anterior']  = '23,45,65,78,99,23,76,89';  //ese seria el 1, el anterior
$tarifas['cad'] = '1,1,1,1,34,56,1,67,1,45';// este el 2, el que hay que actualizar los valores
$_POST['comp'] = '23,45,64,76,54,23,76,89,76,59';// este el nuevo

//Joe! es la cuarta vez que edito el mensaje, estoy torpe

//El $_POST llega de una vez en un array ya directamente ($comp[];) 
Muchas gracias lo primero mortiprogramador.
Si, efectivamente. Yo recibo el array POST, lo comparo con el anterior, cambio los valores o mantengo los de la cadena $tar e inserto el POST y el $tar nuevo en la bd. Pero insertar el POST no tengo problema ya que iba a unir todo el array de nuevo antes de finalizar el primer for. Una vez que tengo las dos variables con el resultado, les quito la primera coma y lo inserto

Última edición por pennyjou; 31/05/2010 a las 15:32
  #4 (permalink)  
Antiguo 01/06/2010, 03:44
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: array de novata

Código PHP:
Ver original
  1. $tar=explode(",", $tarifas['cad']);// cadena tres de valores
  2.  
  3. // Creo que la siguiente linea esta mal:
  4. $caracAnteriores=explode(",", $tar['anterior']);// cadena 1 anterior
  5. // Segun yo, deberia ser:
  6. $caracAnteriores=explode(",", $tarifas['anterior']);// cadena 1 anterior
  7. // Porque acabas de crear $tar y no creo que te conserve alguna coma
  8.  
  9. $comp= $_POST['comp'];// cadena nueva
  10. if(count($tar)>count($comp)){// busco cual es mas larga
  11.     $mayor=count($tar);
  12. }else{
  13.     $mayor=count($comp);
  14. }
  15. for($i=0; $i<$mayor; $i++){
  16.     // Revisa primero si existen ambos valores
  17.     if(!isset($comp[$i]) || !isset($caracAnteriores[$i])) {
  18.         // Que valor asignaras si uno u otro no existen?
  19.         $resultado = ',1';
  20.         continue; // Pasas al siguiente valor
  21.     }
  22.     if($comp[$i]==$caracAnteriores[$i]) {
  23.         $resultado.=",".$tar[$i];// si es igual uno el valor anterior
  24.     }else{
  25.         $resultado.=",1"; // si no es igual pongo un uno
  26.         // Segun yo te sobran las siguientes cuatro lineas porque repites el ciclo
  27.         // for($j=$i; $j<$mayor; $j++){// miro las siguientes
  28.         //   if($comp[$i]==$caracAnteriores[$j]){
  29.         //   $resultado.=",".$tar[$j];// si coincide pongo su valor anterior
  30.         // }
  31.     }
  32. }
  33. echo $resultado;

Todavia se puede simplificar un poco, pero primero necesitas revisar si la logica es correcta y que funcione como esperas.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 01/06/2010, 04:22
 
Fecha de Ingreso: mayo-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 2
Respuesta: array de novata

Hola triby, lo primero muchas gracias por responder
Si, la verdad es que el código que he enviado está bastante mal jijijiji, pero es que lo escrito y reescrito tantas veces que ya me estoy volviendo loca.

El problema es que el número de elementos nuevo puede no ser igual al número de elementos que ya había y encima pueden exitir el valor del elemento en el antiguo pero estar en distinta posicion en el nuevo.
No se si me explico.

Si la antigua, que la primera, es 1,2,3,4,5

La que recibo, que es la segunda para entendernos, 1,2,5,6,7,8

La cadena tercera (a,b,c,d,e) da los valores de la primera cadena

Así al 1->a, 2->b, 3->c , 4->d, 5->e

En la nueva cadena que se forma se cogen los valores de la segunda y si estos no existen se inserta un uno

As,i si recibo lo que había dicho 1,2,5,6,7,8
me debería resultar una cadena que fuera

a,b,e,1,1,1 ya que al 1 le correspodía la a, al 2 la b, al 5 la e y el 6,7,8 no estaban por lo cual se inserta un uno.

No se si se entiende



Código PHP:
$car=explode(",""1,2,3,4,5");// cadena 1 anterior
$tar=explode(",""a,b,c,d,e");// cadena tres de valores
$compexplode(",""1,2,5,6,7,8");// cadena nueva
if(count($tar)>count($comp)){// busco cual es mas larga
$mayor=count($tar);
   }else{
$mayor=count($comp);
}
for(
$i=0$i<$mayor$i++){
   if(
$comp[$i]==$car[$i]){
      
$resultado.=",".$tar[$i];// si los valores por posicion son iguales uno el valor anterior
   
}else{
      
$resultado.=",1"// si no es igual pongo un uno
      
for($j=$i$j<$mayor$j++){// comparo este valor con los siguientes
         
if($comp[$i]==$car[$j]){
         
$resultado.=",".$tar[$j];// si coincide sumo el valor, y aqui debería ver si 
//el siguiente ($comp[$i+1])es igual al siguiente ($car[$j+1]). 
//Si lo es uno, si no lo es debería comparar ($comp[$i+1]) 
//con ($car[$j+2]) y así hasta terminar. 
     
}
  }
}
}
echo 
$resultado

Última edición por pennyjou; 01/06/2010 a las 04:35
  #6 (permalink)  
Antiguo 01/06/2010, 09:45
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: array de novata

Has usado alguna vez in_array()?

Código PHP:
Ver original
  1. for($i=0; $i<$mayor; $i++) {
  2.     // Para simplificar la comparacion llenas los campos vacios
  3.     if(!isset($comp[$i]))
  4.         $comp[$i] = 1;
  5.     if(!isset($caracAnteriores[$i]))
  6.         $caracAnteriores[$i] = 1;
  7.     // Buscas el elemento, independientemente de en que posicion se encuentre:
  8.     if( in_array($comp[$i], $caracAnteriores) ) {
  9.         $resultado.=",".$comp[$i];// si existe, se guarda el numero
  10.     } else {
  11.         $resultado = ',1';
  12.     }
  13. }
  14. echo $resultado;
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 01/06/2010 a las 09:56
  #7 (permalink)  
Antiguo 01/06/2010, 10:31
 
Fecha de Ingreso: mayo-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 2
Respuesta: array de novata

agggggggggggggggg!!!!!!!!!
te voy ha hacer un monumentooooo!!!!

Desde luego cada vez me doy cuenta de que no tengo ni idea. Al final lo importante es la forma de plantear el problema. Tu lo has solucionado de una manera sencilla.
Millones de gracias. déjo el código que he hecho algún ajuste final


Código PHP:

$car
=explode(",""0,2,3,4,5");// cadena 1 anterior
$tar=explode(",""a,b,c,d,e");// cadena tres de valores
$compexplode(",""1,2,6,7,8,9");// cadena nueva
if(count($tar)>count($comp)){// busco cual es mas larga
$mayor=count($tar);
   }else{
$mayor=count($comp);
}
for(
$i=0$i<$mayor$i++) {
    
// Para simplificar la comparacion llenas los campos vacios
    
if(!isset($comp[$i]))
        
$comp[$i] = 1;
    if(!isset(
$car[$i]))
        
$car[$i] = 1;
    
// Buscas el elemento, independientemente de en que posicion se encuentre:
    
if( in_array($comp[$i], $car) ) {
        
$resultado.=",".$tar[$i];// si existe, se guarda el valor de esta posicion
    
} else {
        
$resultado .= ',1'//concatenar
    
}
}
echo 
$resultado
  #8 (permalink)  
Antiguo 01/06/2010, 14:42
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
De acuerdo Respuesta: array de novata

Hola

pennyjou

Bueno, hubiese sido más fácil si hubieras dicho que lo
que necesitabas era una unión de conjuntos (esto para hacerte entender),
pero ya esta! que bueno

Triby
menos mal apareciste con in_array, se me había olvidado
esa excelente función

saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 01/06/2010, 16:28
 
Fecha de Ingreso: mayo-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 2
Respuesta: array de novata

Gracias a tí tambien mortiprogramador por haberte interesado. La verdad es que no tenía ni idea que esto era una unión de conjutos
De todas formas he variado el código ya que me devolvía una cadena con el mismo número de elementos que la antigua, en caso de ser pequeña y además no me colocaba en orden los valores del resultado.
Pero después de ver el manual de php encontré otra función que me indica la key de un array y parece ser que esta vez la apliqué correctamente.
Muchas gracias a los dos y si alguna vez os puedo ayudar en algo (que no sea PHP jajajajaj) podeis contar con mi ayuda.

Código final funcionando perfectamente


Código PHP:

for($i=0$i<$mayor$i++) {
    
// Para simplificar la comparacion llenas los campos vacios
    
if(!isset($comp[$i]))
        
$comp[$i] = 0// cambio a cero porque puede haber valores con uno, con 0 no hay nunca
    
if(!isset($car[$i]))
        
$car[$i] = 0;
    
// Buscas el elemento, independientemente de en que posicion se encuentre:
    
if( in_array($comp[$i], $car) ) {
        
$posicion=array_keys($car$comp[$i]);// buscar la key
        
$resultado.=$tar[$posicion[0]].",";// si existe, se guarda el numero
    
} else {
        if(
$comp[$i]!=0){  // si distinto de cero la concateno
        
$resultado .= '1,';
        }
    }
}
$resultado=substr($resultado0, -1); 

Etiquetas: Ninguno
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 19:34.