Mostrar MP3 ordenados por fecha de añadido en PHP

  • Autor Autor Link
  • Fecha de inicio Fecha de inicio
Link

Link

Gamma
Verificado por Whatsapp
¡Ha verificado su Paypal!
necesito ayuda, tengo un pequeño problemita con un script simple.

PHP:
<? 

    // Pon la ruta del directorio de donde listar los archivos desde el root 
    $path = "/home/xxx/public_html/mp3/Musica/"; 

    // Abrir la carpeta 
    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    // Leer los archivos 
    while ($file = readdir($dir_handle)) { 

    if($file == "." || $file == ".." || $file == "index.php" ) 

        continue; 
        echo "<a href=\"$file\">$file</a><br />"; 

    } 

    // Cerrar 
    closedir($dir_handle); 

?>

con este pequeño codigo muestro todos los mp3 de un directorio, hasta ahí todo perfecto, el problema que tengo es que yo quiero que muestre los mp3 de forma que los últimos temas añadidos salgan en primer lugar, segun estuve mirando en PHP: sort - Manual se puede hacer con $sort_desc pero no logro implementarlo. saludos.
 
Prueba así
PHP:
<?php

$path = '/home/xxx/public_html/mp3/Musica';

$dir = dir($path);

$songs = array();

while($song = $dir->read())
{
	if ( ! in_array($song, array('.', '..', 'index.php')) )
	{
			$songs[] = $song;
	}
}

krsort($songs);

echo '<pre>';
print_r($songs);
echo '</pre>';
Creo que con ese krsort debe funcionar, si al subir una canción ésta queda en el último lugar con krsort se revierte el array entonces la que se ha añadido más recientemente queda en el primer lugar, el problema sería si la carpeta en la que subes las canciones por alguna razón las ordena alfabéticamente o algo
 
Prueba así
PHP:
<?php

$path = '/home/xxx/public_html/mp3/Musica';

$dir = dir($path);

$songs = array();

while($song = $dir->read())
{
	if ( ! in_array($song, array('.', '..', 'index.php')) )
	{
			$songs[] = $song;
	}
}

krsort($songs);

echo '<pre>';
print_r($songs);
echo '</pre>';
Creo que con ese krsort debe funcionar, si al subir una canción ésta queda en el último lugar con krsort se revierte el array entonces la que se ha añadido más recientemente queda en el primer lugar, el problema sería si la carpeta en la que subes las canciones por alguna razón las ordena alfabéticamente o algo

no funciona asi..
 
no funciona asi..
De la manera que he puesto como se ordenan las canciones?

Lo único que te podría decir que funcionaría perfectamente es que uses una base de datos para guardar la url de la canción y cuando fue agregada, entonces cuando quieras hacer el listado haces algo como "ORDER_BY agregado_cuando".

La otra manera que podrías hacer es la siguiente:
PHP:
<?php
$path = '/home/xxx/public_html/mp3/Musica';
$dir = dir($path);
$songs = array();

while($song = $dir->read()){
 
   if ( ! in_array($song, array('.', '..', 'index.php')) )
    {
            $songs[filectime($song)] = $song;
    }
}

krsort($songs);
echo '<pre>';
print_r($songs);
echo '</pre>';
Con eso hacemos que las "keys" de las canciones sean la fecha en la cual se han creado. Supongo que es algo lento porque tenemos que ejecutar "filectime" por cada canción pero bueno.
Luego de ese código si quieres mostrar las canciones tendrás que poner algo como
PHP:
foreach($songs as $song)
{
       echo '<a href="'.$song.'">'.$song.'</a>';
}
 
Última edición:
De la manera que he puesto como se ordenan las canciones?

Lo único que te podría decir que funcionaría perfectamente es que uses una base de datos para guardar la url de la canción y cuando fue agregada, entonces cuando quieras hacer el listado haces algo como "ORDER_BY agregado_cuando".

La otra manera que podrías hacer es la siguiente:
PHP:
<?php
$path = '/home/xxx/public_html/mp3/Musica';
$dir = dir($path);
$songs = array();

while($song = $dir->read()){
 
   if ( ! in_array($song, array('.', '..', 'index.php')) )
    {
            $songs[filectime($song)] = $song;
    }
}

krsort($songs);
echo '<pre>';
print_r($songs);
echo '</pre>';
Con eso hacemos que las "keys" de las canciones sean la fecha en la cual se han creado. Supongo que es algo lento porque tenemos que ejecutar "filectime" por cada canción pero bueno.
Luego de ese código si quieres mostrar las canciones tendrás que poner algo como
PHP:
foreach($songs as $song)
{
       echo '<a href="'.$song.'">'.$song.'</a>';
}

ahora si las ordena como yo quiero pero no me salen las canciones. ocea me sale la pagina en blanco y cuando miro el codigo fuente están bien ordenadas pero no tienen el link de descargar.
 
Hola, había salido y por eso no pude contestar.
PHP:
<?php
$path = '/home/xxx/public_html/mp3/Musica';
$dir = dir($path);
$songs = array();
// cambie "$song" por "$sng" para ver si ese era el problema
while($sng = $dir->read()){
 
   if ( ! in_array($sng, array('.', '..', 'index.php')) )
    {
            $songs[filectime($sng)] = $sng;
    }
}
// agregue lo de "$dir->close()", me lo había olvidado
$dir->close();

krsort($songs);

foreach($songs as $song)
{
echo '<a href="'.$song.'">'.$song.'</a>';
}
Prueba así, tal vez era porque la variable $song que se usa en el while para obtener las canciones la usaba también en el foreach
 
Última edición:
Hola, había salido y por eso no pude contestar.
PHP:
<?php
$path = '/home/xxx/public_html/mp3/Musica';
$dir = dir($path);
$songs = array();
// cambie "$song" por "$sng" para ver si ese era el problema
while($sng = $dir->read()){
 
   if ( ! in_array($sng, array('.', '..', 'index.php')) )
    {
            $songs[filectime($sng)] = $sng;
    }
}
// agregue lo de "$dir->close()", me lo había olvidado
$dir->close();

krsort($songs);

foreach($songs as $song)
{
echo '<a href="'.$song.'">'.$song.'</a>';
}
Prueba así, tal vez era porque la variable $song que se usa en el while para obtener las canciones la usaba también en el foreach

Ok, muchas gracias amigo.

Hola, había salido y por eso no pude contestar.
PHP:
<?php
$path = '/home/xxx/public_html/mp3/Musica';
$dir = dir($path);
$songs = array();
// cambie "$song" por "$sng" para ver si ese era el problema
while($sng = $dir->read()){
 
   if ( ! in_array($sng, array('.', '..', 'index.php')) )
    {
            $songs[filectime($sng)] = $sng;
    }
}
// agregue lo de "$dir->close()", me lo había olvidado
$dir->close();

krsort($songs);

foreach($songs as $song)
{
echo '<a href="'.$song.'">'.$song.'</a>';
}
Prueba así, tal vez era porque la variable $song que se usa en el while para obtener las canciones la usaba también en el foreach

O espera nose que pasa que no me muestra todos los mp3, ocea solo muestra algunos como si estuviera siguiendo algun filtro o algo. algo raro.
 
Atrás
Arriba