Foros del Web » Programando para Internet » PHP »

PHP OO Leyendo archivos y agrupandolos

Estas en el tema de Leyendo archivos y agrupandolos en el foro de PHP en Foros del Web. Saludos! Mi problema es el siguiente: Desde php leo una carpeta con muchos archivos mp3, todos inician 2008...titulo.mp3, 2009...titulo.mp3, 20010...titulo.mp3. Asi sucesivamente. Lo que yo ...
  #1 (permalink)  
Antiguo 23/04/2011, 14:50
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Leyendo archivos y agrupandolos

Saludos!
Mi problema es el siguiente:
Desde php leo una carpeta con muchos archivos mp3, todos inician
2008...titulo.mp3, 2009...titulo.mp3, 20010...titulo.mp3. Asi sucesivamente.

Lo que yo intento lograr es encerrar cada grupo de archivos segun el año, para poder generar un xml, de esta manera:

<Inicia 2008>
2008...titulo.mp3
2008...titulo.mp3
2008...titulo.mp3
<Termina 2008>

<Inicia 2009>
2009...titulo.mp3
2009...titulo.mp3
2009...titulo.mp3
<Inicia 2009>

<Inicia 2010>
2010...titulo.mp3
.......
<Inicia 2010>

Me gustaría lograrlo con los menos bucles posibles ya que son demasiados. Y mi método implica utilizar otro bucle para extraer el array final.

Espero puedan ayudarme con un ejemplo de cómo debo hacerlo.

He generado este código, pero al final me redunda los datos. De antemano muchas gracias.

Código:
$path="D:\wamp\www\leyendo\esto";
$dir=dir($path);
$contador=0;
$concatenar="";
$ano=2007;
$grupo = array();


	while ($elemento = $dir->read())
	{
		$laExtension=strtolower(end(explode('.',$elemento)));				
		if (($laExtension == 'mp3') and ($elemento != '.') and ($elemento != '..')){

			$ano_variante = substr($elemento, 0, 4)."<br/>";
						
			if($ano_variante!=$ano){ // Cuando cambie el año
				$ano=$ano_variante;
				if($contador==0){ //Intento crear el primer grupo en el array. arrya[0(abriendo),1(info),2(cerrando)]
				$contador_abrir=$contador;
				$contador_info=$contador_abrir+1;
				$contador_cerrar=$contador_info+1;
				
				$grupo[$contador_abrir]="Inicia";
				$grupo[$contador_cerrar]="Termina";
										
				}else{//intento crear los demas grupos.
				$contador_abrir=$contador*3;
				$contador_info=$contador_abrir+1;
				$contador_cerrar=$contador_info+1;					

				$grupo[$contador_abrir]="Inicia";
				$grupo[$contador_cerrar]="Termina";
				}			
				$contador++;	
			}

			$concatenar.="<br/>".$elemento;
			$grupo[$contador_info]=$concatenar;

		}
	}
$dir->close();
print_r ($grupo);
  #2 (permalink)  
Antiguo 23/04/2011, 16:21
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Leyendo archivos y agrupandolos

usa un algoritmo de ordenación, como el burbujas doble, así al tener los datos ordenados es más facl clasificarlos.

aunque una mejor estrategia seria registrarlos en una tabla de base de datos y usar SQL para clasificarlos eficientemente
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 23/04/2011, 20:46
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Leyendo archivos y agrupandolos

Gracias por responder maycolalvarez, talvez el usar burbujas dobles sea la solución pero no tengo idea de como hacerlo. Y el usar base de datos queda descartado por otras razones.

Talvez puedas explicarme con algún ejemplo la primera alternativa que propones.
  #4 (permalink)  
Antiguo 23/04/2011, 20:49
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Leyendo archivos y agrupandolos

el algoritmo de burbujas doble es genérico y lo consigues en cualquier tutorial básico de programación (es muy corto además), ¿para que reinventar la rueda si ya está hecho?, claro que para cuando lo estudias en la universidad debes de comprenderlo, analizarlo y hacerlo en el acto

http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 23/04/2011, 21:02
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Leyendo archivos y agrupandolos

....Bueno gracias.... por el momento no veo como decifrar la solución a mi problema. Bien por ti que sea facil.
  #6 (permalink)  
Antiguo 23/04/2011, 21:30
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Leyendo archivos y agrupandolos

Jega_77 Te recomiendo que leas el enlace, ahí tienes el ejemplo como hacerlo con PHP.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 23/04/2011, 21:41
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Leyendo archivos y agrupandolos

abimaelrc Gracias por tu recomendación, antes de abrir este tema ya había encontrado ese método, pero no logro adaptarlo. Seguiré intentando.
  #8 (permalink)  
Antiguo 23/04/2011, 21:59
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Leyendo archivos y agrupandolos

Bueno una forma sencilla es hacer algo así
Código PHP:
Ver original
  1. <?php
  2. $arr = array();
  3. foreach(glob('ruta/hacia/el/directorio/*') as $file){
  4.     $pathInfo = pathinfo($file);
  5.     $arr[substr($pathInfo['basename'], 0, 4)][] = $pathInfo['basename'];
  6. }
  7. echo '<pre>';
  8. print_r($arr);
  9. echo '</pre>';
Luego sería cuestión de ir recorriendo el nuevo array, e ir ingresando todo en el xml.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 23/04/2011, 23:01
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Leyendo archivos y agrupandolos

Solo replanteando mi problema, lo único que busco es obtener una lista como en el ejemplo, la cantidad de veces que se repite cada color sería variable o incierta.

Amarillo
Amarillo
Amarillo
Verde
Verde
Verde
Naranja
Naranja
Naranja

Convertir en esto:

<inicia amarillo>
Amarillo
Amarillo
Amarillo
<termina>
<inicia verde>
Verde
Verde
Verde
<termina>
<inicia naranja>
Naranja
Naranja
Naranja
<termina>

Tengo este nuevo código, pero solo logro generar el tag de apertura.
Código PHP:
<?php
$path
="D:\wamp\www\leyendo\esto";
$dir=dir($path);
$ano=2007;

    while (
$elemento $dir->read())
    {
        
$laExtension=strtolower(end(explode('.',$elemento)));                
        if ((
$laExtension == 'mp3') and ($elemento != '.') and ($elemento != '..')){

            
$ano_variante substr($elemento04);
                        
            if(
$ano_variante!=$ano){
                
$ano=$ano_variante;
                echo 
"<br/>&lt;Inicia ".$ano."&gt;<br/>";
            }            
            echo 
$elemento."<br/>";
        }
    }
$dir->close();
?>
  #10 (permalink)  
Antiguo 24/04/2011, 09:11
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Leyendo archivos y agrupandolos

Indicaste que era conforme a los años. Ya te coloqué un ejemplo que mira los primeros cuatros caracteres y lo asigna como una llave, ese código lo que imprimiría sería algo como
Cita:
Array
(
[2008] => Array
(
[0] => 2008-titulo1.txt
[1] => 2008-titulo2.txt
)

[2009] => Array
(
[0] => 2009-titulo1.txt
[1] => 2009-titulo2.txt
)

[2010] => Array
(
[0] => 2010-titulo1.txt
[1] => 2010-titulo2.txt
)

[2011] => Array
(
[0] => 2011-titulo1.txt
[1] => 2011-titulo2.txt
)

)
¿Eso es lo que quieres? Luego sería cuestión de ir ingresando los valores en un XML. Puedes usar SimpleXML o DOM. Con SimpleXML sería algo así
Código PHP:
Ver original
  1. <?php
  2. $arr = array();
  3. foreach(glob('temp/*') as $file){
  4.     $pathInfo = pathinfo($file);
  5.     $arr[substr($pathInfo['basename'], 0, 4)][] = $pathInfo['basename'];
  6. }
  7.  
  8. $xml = new SimpleXMLElement('<music></music>');
  9. foreach($arr as $key => $val){
  10.     $year = $xml->addChild('year_' . $key);
  11.     foreach($val as $v){
  12.         $year->addChild('song', $v);
  13.     }
  14. }
  15. file_put_contents('music.xml', $xml->asXML());
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 24/04/2011, 13:20
 
Fecha de Ingreso: abril-2011
Ubicación: El Salvador
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Leyendo archivos y agrupandolos

Excelente!!! abimaelrc, me distes la pista que necesitaba. Logré mi objetivo y mejor aún con un solo bucle. Mil gracias!!

Aquí dejo el código, talvez le sirva a alguien más.

Código PHP:
$path="D:\wamp\www\leyendo\esto";
$dir=dir($path);
$ano=2007;
$contador=1;

$xml = new SimpleXMLElement("<galeria></galeria>");
$albunes=$xml->addChild('albums');

    while (
$elemento $dir->read())
    {
        
$laExtension=strtolower(end(explode('.',$elemento)));                
        if ((
$laExtension == 'mp3') and ($elemento != '.') and ($elemento != '..')){

            
$ano_variante substr($elemento04);
            if(
$ano_variante!=$ano){
                
$ano=$ano_variante;
                
$album $albunes->addChild('album_'$ano);
                
$album->addAttribute('id',$contador);
                
$contador++;
            }             
            
$album->addChild('tracks'$elemento);                                      
        }
    }
$dir->close();


file_put_contents('musica.xml'$xml->asXML()); 

Etiquetas: xml
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 18:17.