Foros del Web » Programando para Internet » PHP »

Función Unset

Estas en el tema de Función Unset en el foro de PHP en Foros del Web. Hola a tod@s, estoy programando una sencilla función que elimina los elementos duplicados de un array. El código de la función es este: Código: for($i=0; ...
  #1 (permalink)  
Antiguo 20/08/2011, 05:29
 
Fecha de Ingreso: febrero-2005
Ubicación: Madrid
Mensajes: 549
Antigüedad: 19 años, 10 meses
Puntos: 0
Función Unset

Hola a tod@s,

estoy programando una sencilla función que elimina los elementos duplicados de un array. El código de la función es este:
Código:
for($i=0; $i<(count($v)-1); $i++){
    $j=$i+1;
    while($j<count($v))
      if($v[$i]==$v[$j])
        unset($v[$j]);
      else
        $j++;
}  //Fin For
En teoría la función debiera funcionar (valga la redundancia) correctamente pero ante la entrada: 1 1 3 5 5 7 7 9 me devuelve 1 3 5 7 7 9 es decir, elimina sólo alguno de los duplicados ya que el 7 sigue mostrándolo 2 veces :S

El caso es que he hecho la traza en papel y la función debiera funcionar bien pero, por algún motivo, no lo hace :( Pienso que podría deberse a que la función Unset no se comporta como yo creo que lo hace pero he mirado en la documentación oficial de PHP y todo parece estar OK! así que, sinceramente, no tengo ni idea de porqué ésto falla.

Si me pueden echar una mano, se lo agradezco!!

Un saludo,
Jose
__________________
Nadie dijo que ésto iba a ser fácil
  #2 (permalink)  
Antiguo 20/08/2011, 06:20
Avatar de Hazuki  
Fecha de Ingreso: mayo-2011
Mensajes: 34
Antigüedad: 13 años, 7 meses
Puntos: 7
Respuesta: Función Unset

Yo lo conseguí de esta forma:

Código PHP:
$v = array(1,1,3,5,5,7,7,9);

// Guardamos la longitud inicial de $v
$n count($v);
for(
$i=0$i<$n-1$i++) {
    
$j=$i+1;

    
// Comprobamos que exista el índice $i, de lo contrario el bucle continúa
    
if (isset($v[$i])) {
        while(
$j<$n) {

            
// Comprueba si el índice $j existe y es igual al índice $i
            
if(isset($v[$j]) && $v[$i]==$v[$j])
                unset(
$v[$j]);

            
// De lo contrario saltamos al siguiente $j
            
else
                
$j++;
        }
    }

Lo que pasaba era que al entrar al bucle "for", la función "count($v)" devuelve un valor, y cada vez que entras al bucle "while" devuelve otro distinto porque vuelve a contar la variable, por lo que si has borrado un índice te devolverá un número menor al inicial.

Entonces, lo que hice fue guardar la longitud inicial de $v en $n y en cada bucle, tanto "for" como "while", comprobar que existe el índice en el que se encuentran para evitar errores.

Espero que te sirva.
  #3 (permalink)  
Antiguo 20/08/2011, 08:28
Avatar de Ronruby  
Fecha de Ingreso: julio-2008
Ubicación: 18°30'N, 69°59'W
Mensajes: 4.879
Antigüedad: 16 años, 5 meses
Puntos: 416
Respuesta: Función Unset

*cough*
Código PHP:
$v = array(1,1,3,5,5,7,7,9); 
$v array_unique($v);
var_dump($v); 
*cough*
  #4 (permalink)  
Antiguo 20/08/2011, 08:35
Avatar de Hazuki  
Fecha de Ingreso: mayo-2011
Mensajes: 34
Antigüedad: 13 años, 7 meses
Puntos: 7
Respuesta: Función Unset

Esa no me la sabía xDD
  #5 (permalink)  
Antiguo 29/08/2011, 11:33
 
Fecha de Ingreso: febrero-2005
Ubicación: Madrid
Mensajes: 549
Antigüedad: 19 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Función Unset

Muchas gracias Hazuki y Ronruby

Saludos,
Jose
__________________
Nadie dijo que ésto iba a ser fácil

Etiquetas: unset
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 14:03.