Foros del Web » Programando para Internet » PHP »

Problemas con explode (!)

Estas en el tema de Problemas con explode (!) en el foro de PHP en Foros del Web. Amigos: creia conocer la funcion explode() pero me lleve una sorpresa al ver que tiene un comportamiento extraño. En una parte de un programa intento ...
  #1 (permalink)  
Antiguo 27/03/2008, 10:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Exclamación Problemas con explode (!)

Amigos: creia conocer la funcion explode() pero me lleve una sorpresa al ver que tiene un comportamiento extraño.

En una parte de un programa intento excluir una lista de palabras de un array.

La "exclusion" funciona perfectamente si el array de palabras[] lo armo "a mano" pero falla si lo genero mediante un explode de un array

Les dejo el codigo para que vean (y si pueden... ayuden)

Código PHP:
<?php

$str 
"Samsung se ha aliado con la firma de productos cosmeticos Nails Inc para lanzar una edicion especial de su telefono G600 que llevara el sobrenombre de Belle Las caracteristicas del terminal seran las mismas de la edicion normal mas el dispositivo sera de color purpura y se vendera con tres frascos de pintura de uñas incluyendo uno a juego con el color del celular El Samsung G600 Belle se vendera de forma exclusiva en la tienda britanica Phones4u";

$str strtolower($str);

$excluidas = array("la","lo","las","los","a""ante""bajo""cabe""con""contra""de""del""desde""durante""en""entre""hacia""hasta""mediante""para""por""pro""segun""sin""so""sobre""tras""versus""via","yo","tu","el","ella","nosotros","vosotros""ellos""hacer","que","cuando","como","porque","un","una","uno","dos","tres","es","son","se","su","sus","ha","han");

$palabras explode (" ",$str); // puede haber repetidas
//$palabras = array ("samsung","ha","sido","la","empresa","lider");

// purgo de palabras vacias
For ($i=0;$i<count($palabras);++$i){
  If ( 
strlen($palabras[$i])==){
    
array_splice ($palabras,$i,1); // elimino elemento del array
  
}
}

//print_r ($palabras);

For ($i=0;$i<count($palabras);++$i){
  If (     
in_array($palabras[$i], $excluidas ) ){
    
array_splice ($palabras,$i,1); // elimino elemento del array
  
}
}

print_r ($palabras);
?>
NOTAR que si habilitan la linea siguiente, las palabras "ha", y "la" son excluidas corectamente

Código PHP:
$palabras = array ("samsung","ha","sido","la","empresa","lider"); 
EDIT: con split() tampoco funciona:

Código PHP:
Function explode2($substr$str){
  
$salida split('[ ]'$str);
return 
$salida
__________________
Salu2!

Última edición por Italico76; 27/03/2008 a las 10:30
  #2 (permalink)  
Antiguo 27/03/2008, 12:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Problemas con explode (!)

Prueba cambiar tu:
Código PHP:
array_splice ($palabras,$i,1); // elimino elemento del array 
Por:
Código PHP:
unset( $palabras[$i] ); 
Saludos.
  #3 (permalink)  
Antiguo 27/03/2008, 14:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Desacuerdo Re: Problemas con explode (!)

GatorV: gracias pero no hubo ningun cambio (ya lo probe) porque como dije, el problema esta en como se genera el array (en el explode)

A ver si alguien prueba el codigo..... porque puede haber un BUG en explode()

gracias!!!
__________________
Salu2!
  #4 (permalink)  
Antiguo 27/03/2008, 14:57
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Exclamación Algo anda muy mal (BUG ?)

Despues de probar con explode() y split(), me hice una funcion splitter() que funciona como explode() a los efectos del programa SIN cambios :

Código PHP:
Function splitter($str){
$palabras = array();
$k=0;
  For (
$i=0;$i<strlen($str);++$i){
    If (
$str[$i]==" "){
    ++
$k;
    }else{    
    
$palabras[$k] .=  $str[$i];
    }
  }
return 
$palabras;

El programa ahora quedo asi (siempre da la MISMA salida)

Código PHP:
<?php

Function splitter($str){
$palabras = array();
$k=0;
  For (
$i=0;$i<strlen($str);++$i){
    If (
$str[$i]==" "){
    ++
$k;
    }else{    
    
$palabras[$k] .=  $str[$i];
    }
  }
return 
$palabras;
}

$str "Samsung se ha aliado con la firma de productos cosmeticos Nails Inc para lanzar una edicion especial de su telefono G600 que llevara el sobrenombre de Belle Las caracteristicas del terminal seran las mismas de la edicion normal mas el dispositivo sera de color purpura y se vendera con tres frascos de pintura de uñas incluyendo uno a juego con el color del celular El Samsung G600 Belle se vendera de forma exclusiva en la tienda britanica Phones4u";

$str strtolower($str);

$excluidas = array("la","lo","las","los","a""ante""bajo""cabe""con""contra""de""del""desde""durante""en""entre""hacia""hasta""mediante""para""por""pro""segun""sin""so""sobre""tras""versus""via","yo","tu","el","ella","nosotros","vosotros""ellos""hacer","que","cuando","como","porque","un","una","uno","dos","tres","es","son","se","su","sus","ha","han");

//$palabras = explode (" ",$str); // puede haber repetidas
$palabras splitter ($str);

//$palabras = array ("samsung","ha","sido","la","empresa","lider");

// purgo de palabras vacias
For ($i=0;$i<count($palabras);++$i){
  If ( 
strlen($palabras[$i])==){
    
//array_splice ($palabras,$i,1); // elimino elemento del array
    
unset( $palabras[$i] );  
  }
}

print_r ($palabras);

For (
$i=0;$i<count($palabras);++$i){
  If (     
in_array($palabras[$i], $excluidas ) ){
    
//array_splice ($palabras,$i,1); // elimino elemento del array
    
unset( $palabras[$i] );  
  }
}

//print_r ($palabras);
?>
A ver si me ayudan! // gracias!!
__________________
Salu2!
  #5 (permalink)  
Antiguo 27/03/2008, 15:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Problemas con explode (!)

Tu problema no es el explode, tu problema es en la comparación de tu for, al poner: $i < count($palabras), cada vuelta del for, count te regresa la longitud de tu arreglo, pero como empiezas a borrar, la longitud decrece y no recorre todo el arreglo.

He probado este código en mi PC y funciona adecuadamente:
Código PHP:
<?php
header
"Content-type: text/plain" );
$str "Samsung se ha aliado con la firma de productos cosmeticos Nails Inc para lanzar una edicion especial de su telefono G600 que llevara el sobrenombre de Belle Las caracteristicas del terminal seran las mismas de la edicion normal mas el dispositivo sera de color purpura y se vendera con tres frascos de pintura de uñas incluyendo uno a juego con el color del celular El Samsung G600 Belle se vendera de forma exclusiva en la tienda britanica Phones4u";

$str strtolower($str);

$excluidas = array("la","lo","las","los","a""ante""bajo""cabe""con""contra""de""del""desde""durante""en""entre""hacia""hasta""mediante""para""por""pro""segun""sin""so""sobre""tras""versus""via","yo","tu","el","ella","nosotros","vosotros""ellos""hacer","que","cuando","como","porque","un","una","uno","dos","tres","es","son","se","su","sus","ha","han");

$palabras explode (" ",$str); // puede haber repetidas
//$palabras = array ("samsung","ha","sido","la","empresa","lider");

// purgo de palabras vacias
$total count($palabras);
for(
$i=0$i $total ; ++$i){
  if ( 
strlen($palabras[$i])==){
    unset( 
$palabras[$i] );
  }
}

//var_dump($palabras);

$total count($palabras);
for(
$i=0$i $total ; ++$i){
  if ( 
in_array(strtolower($palabras[$i]), $excluidas ) ){
     unset( 
$palabras[$i] );
  }
}

var_dump($palabras);
?>
Saludos.
  #6 (permalink)  
Antiguo 27/03/2008, 18:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Re: Problemas con explode (!)

GatorV: como suelen decir por aca "tu respuesta es digna de un moderador"

Te agradezco un monton! me has hecho terminar con felicidad este dia
__________________
Salu2!
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:52.