Foros del Web » Programando para Internet » PHP »

Como emparejar un array que tiene "huecos" ?

Estas en el tema de Como emparejar un array que tiene "huecos" ? en el foro de PHP en Foros del Web. Existe alguna funcion nativa de PHP para ello? Por ejemplo el array: Código PHP: $nombre =array( 'juan' , pablo ','','','','','',' diego );  Al recibir Código ...
  #1 (permalink)  
Antiguo 20/06/2005, 17:36
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Como emparejar un array que tiene "huecos" ?

Existe alguna funcion nativa de PHP para ello?

Por ejemplo el array:
Código PHP:
$nombre=array('juan',pablo','','','','','','diego); 
Al recibir
Código PHP:
array_unique 
elimina los elementos 3,4,5,6

Luego me quedan los "huecos" en el array.

Como puedo CORRER LOS VALORES?

De tal forma que 'diego' quede en el valor [4] ?

Existe alguna funcion para eliminar los elementos vacios de un array?

Última edición por Anarko; 20/06/2005 a las 17:53
  #2 (permalink)  
Antiguo 20/06/2005, 23:09
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
hola, que tal, tarde un poco en hacerlo, bueno en realidad tarde porq no me llevo bien con la sintaxis de php, mira aca te dejo algo, no es el mas recomendado ni la mejor forma de hacerlo, pero cumple con su objetivo....
Código PHP:
$nombre=array('juan','pablo','','','','','','diego');

while(list(
$llave,$valor) = each($nombre))
{
        if(
$valor == "")
        {
                unset(
$nombre[$llave]);
        }
}

$nombre explode(":",(implode(":",$nombre))); 
esto arrojaria el array asi...
Código:
array(3)
{
   [0]=> string(4) "juan"
   [1]=> string(5) "pablo"
   [2]=> string(5) "diego"
}
para que entiendas bien que es lo que hago (si es necesario, es bastante simple) te dejo aca el codigo en una forma mas larga asi te das cuenta de que es lo que hago...
Código PHP:
$nombre=array('juan','pablo','','','','','','diego');

// Aca se elimina los elemento q no contienen nada...
while(list($llave,$valor) = each($nombre))
{
        if(
$valor == "")
        {
                unset(
$nombre[$llave]);
        }
}
// Aca formo un string que une los
// elementos del array y los separa por :
$arreglo implode(":",$nombre);
// Aca separo el string cada vez que encuentra :
// y cada pedazo lo va insertando en un array
$nombre explode(":",$arreglo); 
lo dificil fue mantener el orden de lo elementos, es por eso q uso un implode() y un explode() si no importara el orden, tambien se podria eliminar el implode() y el explode() y solamente utilizar un sort($nombre) lo que hace es ordenar los elementos alfabeticamente y redefine las posiciones de los elementos... bueno espero que te sirva... saludos
  #3 (permalink)  
Antiguo 21/06/2005, 02:14
 
Fecha de Ingreso: mayo-2005
Mensajes: 1
Antigüedad: 18 años, 10 meses
Puntos: 0
Cita:
Iniciado por Anarko
Existe alguna funcion para eliminar los elementos vacios de un array?
No es una funcion nativa de php, pero esta en su web

Código PHP:
function remove_empty($inarray) {

     if (
is_array($inarray)) {

         foreach(
$inarray as $k=>$v) {
             if (!(empty(
$v))) {
                 
$out[$k]=$v;
             }
         }

         return 
$out;

     } else {
         return 
$inarray;
     }

  } 
  #4 (permalink)  
Antiguo 21/06/2005, 08:22
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Gracias a ambos,

Solo sucede que borrar todos los elementos vacios y la idea es borrar los inexistentes, por ejemplo no deberia borrar el elemento [0], (o uno), ya que ademas de no estar repetido, EXISTE:
Código PHP:
    $nombre=array('','juan','kio','pol','pol','pol','pol','pol','pol','phol','pgol','yui');
    
$nombre=(array_unique($nombre));

    while(list(
$llave,$valor) = each($nombre)){
            if(
$valor == "")unset($nombre[$llave]);
    }
    
sort($nombre);
    for(
$a=0;$a<count($nombre);$a++)echo "$nombre[$a] - "
Lamento molestar de nuevo, si lo perfeccionas [DarioDario] + gracias.

La funcion [remove_empty] no sirve.
  #5 (permalink)  
Antiguo 21/06/2005, 08:58
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
hola, no veo bien cual es el tema... como dices en el ultimo post no deveria borrar el elemento 0, pero sino lo tendria q borrar no veo los huecos en el array, cual es el criterio para borrar elementos, si podrias ser un poquito mas claro te lo arreglaria, pero no entiendo el porq de no borrar el elemento 0 si este esta vacio... explicame cual se toma comohueco y cual no, y vemos si se puede arreglar.... saludos
  #6 (permalink)  
Antiguo 21/06/2005, 18:14
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Gracias Profesor DD:

$nombre=array('','juan','kio','pol','pol','pol','p ol','pol','pol','phol','pgol','yui');

Luego de recibir el [ $nombre=(array_unique($nombre)); ]
tendra vacio los elementos que tienen "pol" por valor.

Esos son los elementos que deben dejar de existir, es decir los repetidos.

Ya que si luego se hace el

for($a=0;$a<count($nombre);$a++)echo "$nombre[$a] - ";

Dara tantos errores como elementos INEXISTENTES halla.

Muy amable amigo.
  #7 (permalink)  
Antiguo 21/06/2005, 18:53
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
buenas, mira encontre como hacerlo no estabamos muy lejos de lo echo hasta aqui, y por fin pude entender bien que era lo que querias hacer... bueno este creo q es el script terminado ...
Código PHP:
<?php

    $nombre
=array('','juan','kio','pol','pol','pol','p  ol','pol','pol','phol','pgol','yui'); // Etapa (1) 
    
$nombre=array_unique($nombre); // Etapa (2)

    
$nombre explode(":",(implode(":",$nombre))); // Etapa (3)

    
while(list($llave,$valor) = each($nombre))
    {
            echo 
$llave." - ".$valor."<br>";
    }

?>
esto seria lo que pasa, te muestro los array en cada "Etapa"...

Código:
array(12) // (1) Array sin procesar..
{
	[0]=> string(0) ""
	[1]=> string(4) "juan"
	[2]=> string(3) "kio"
	[3]=> string(3) "pol"
	[4]=> string(3) "pol"
	[5]=> string(3) "pol"
	[6]=> string(5) "p ol"
	[7]=> string(3) "pol"
	[8]=> string(3) "pol"
	[9]=> string(4) "phol"
	[10]=> string(4) "pgol"
	[11]=> string(3) "yui"
}

array(8) // (2) Array despues de array_unique()
{
	[0]=> string(0) ""
	[1]=> string(4) "juan"
	[2]=> string(3) "kio"
	[3]=> string(3) "pol"
	[6]=> string(5) "p ol"
	[9]=> string(4) "phol"
	[10]=> string(4) "pgol"
	[11]=> string(3) "yui"
}

array(8) // (3) Array procesado...
{
	[0]=> string(0) ""
	[1]=> string(4) "juan"
	[2]=> string(3) "kio"
	[3]=> string(3) "pol"
	[4]=> string(5) "p ol"
	[5]=> string(4) "phol"
	[6]=> string(4) "pgol"
	[7]=> string(3) "yui"
}
bueno espero que te sirva y agradeceria que postees como te quedo el script o si este mismo te sirve, asi este threadsirve a otras personas.... saludos...
  #8 (permalink)  
Antiguo 22/06/2005, 06:27
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Resulto PERFECTO!!!!!

Muchas gracias.

Te cuento que estava haciendolo asi:
Código PHP:
    for($a=0;$a<count($linea);$a++)
    if(!empty(
$linea[$a])){
        
$contenido.=$linea[$a];
        }
?> 
Y no funcionaba bien, solo me daba 5000 datos, ahora si me da los 50 mil que requeria.

(El array oryginal son 300 Mil).

Por eso requeria algo MUY corto, sin muchas funciones o condicionales.

Tu script salio magnifico!.

Claro!, tuve que editar el PHP.INI para time =0; y + de las 8 Megas por defecto, pero ya tengo mi info bien ordenada.

Gracias de nuevo [DarioDario]
  #9 (permalink)  
Antiguo 22/06/2005, 07:11
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
De nada Anarko pero, 300 mil? Es demaciado grande, ahora despues de leer todo, quede satisfecho con que te pude ayudar, pero me quedo una duda, tu script manejando el array de 300 mil elementos, ¿Cuanto tarda en terminar todo el proceso?... saludos
  #10 (permalink)  
Antiguo 22/06/2005, 09:19
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Llevo 3 dias trabajando con eso...

Se tarda 125 minutos.

Aqui te pego parte del resultado de mi scriipt:
Código PHP:
<b>Inicio:</b2005-06-21 19:54:35
    
<b>Final: </b2005-06-21 21:29:35
    Originalmente 
[<b>309133</b>] datos
    Ahora hay 
[<b>32078</b>] datos
    Se eliminaron 
[<b>277055</b>] datos 
Asi que era como un descanso para mi...

En ocaciones paso + de 18 horas en el Pc.

En que pais estas?.
  #11 (permalink)  
Antiguo 22/06/2005, 09:22
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Aqui te paso un post solucionado pero interesante, ya que te veo un poco "inquieto":

http://www.forosdelweb.com/f18/como-escribir-numeros-0-256-octal-306933/
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 15:31.