Trier une listbox qui liste un répertoire...?
Bonjour à tous, j'ai actuellement une listbox qui se rempli avec le contenu d'un repretoire. Mais je désire faire un tri par ordre alphabetique "humain". Mais étant un gros déburant, je ne vois pas comment adapté la fonction NATCASESORT avec mon code.
Si quelqu'un pouvait m'aider, ça serait super :
<?php
$rep ='../upload/';
if (!is_dir ($rep)) {
echo 'Erreur, ', $dir,' n\'est pas un repertoire valide';
exit;
}
$dir = opendir ($rep);
while (false !== ($fichier = readdir ($dir))) {
if ($fichier !== '..' && $fichier !== '.') {
echo '<option value="',$fichier,'">',$fichier,'</option>';
}
}
?>
Voici une solution possible :
1) Dans ton while, au lieu d'afficher les options de ton select, il te suffit de stocker ces noms de fichier dans un tableau.
2) Ensuite, tu tries le tableau grâce à la fonction
sort.
3) Puis tu fais un foreach sur ce tableau pour afficher tes <option>.
Merci beaucoup pour ton explication mais houla, je vais voir ce que je peux faire avec les infos que tu m'as transmis et mes connaissances ;)
Bon, j'ai tenté pas à pas, je fais ma boucle ....
<?php
while($val=mysql_fetch_array($result))
if($val["valid"] == 1)
{
$id=$val['ID'];
$aFile=$val['aFile'];
echo"$aFile";
echo "<br />";
}
?>
Jusque la, ça va, mais si je fais un mélange des deux :
<?php
$rep ='../upload/';
if (!is_dir ($rep)) {
echo 'Erreur, ', $dir,' n\'est pas un repertoire valide';
exit;
}
$dir = opendir ($rep);
while (false !== ($fichier = readdir ($dir))) {
if ($fichier !== '..' && $fichier !== '.') {
while($val=mysql_fetch_array($result))
if($val["valid"] == 1)
{
echo"$fichier";
echo "<br />";
}
}
}
?>
Je n'affiche plus rien ,et j'ai encore rien trié car je cherche toujours comment me servir de la fonction sort.
Qu'est que je galère avec les ARRAY...
Vais m'en sortir, vais m'en sortir ....
<?php
$rep ='../upload/';
if (!is_dir ($rep)) {
echo 'Erreur, ', $dir,' n\'est pas un repertoire valide';
exit;
}
$dir = opendir ($rep);
while (false !== ($fichier = readdir ($dir))) {
if ($fichier !== '..' && $fichier !== '.') {
//
//
$contenu = array ("$fichier");
foreach($contenu as $cle => $element)
{
echo '<option value="',$fichier,'">',$fichier,'</option>';
}
}
}
?>
Avant ton while, fais un :
$contenu = array ();
Et dans le while, change ton $contenu = array ("$fichier"); en $contenu[] = $fichier;
Ensuite, il faut fermer le while avant de lancer le foreach (le while sert à remplir le tableau, foreach sert à afficher les fichiers, il ne faut pas les mélanger).
Cela devrait fonctionner.
Hello,
effectivement, ça marche beaucoup mieux, ça tri bien par ordre alphabetique ;)
Juste un defaut, il me marque plusieurs fois le même fichier.
<?php
$rep ='../upload/';
if (!is_dir ($rep)) {
echo 'Erreur, ', $dir,' n\'est pas un repertoire valide';
exit;
}
$dir = opendir ($rep);
$contenu = array ();
while (false !== ($fichier = readdir ($dir))) {
if ($fichier !== '..' && $fichier !== '.') {
//
//
$contenu[] = $fichier;
}
foreach($contenu as $cle => $element)
{
echo '<option value="',$fichier,'">',$fichier,'</option>';
}
}
?>
En fait, dans l'affichage il incremente de 1 à chaque fois, par exemple :
a
b
b
c
c
c
d
d
d
d
J'ai une erreur dans ma boucle...
Je t'ai dis qu'il fallait faire le foreach en dehors du while...
Indente ton code, tu verras que ton foreach est dans ton while.
J'avais mal lu. Désolé et merci de ta patience ;)
Sauf que si je le sors du while il n'affiche plus rien dans la listbox ... et il doit surement falloir que je lui redéclare une variable.
<?php
$rep ='../upload/';
if (!is_dir ($rep)) {
echo 'Erreur, ', $dir,' n\'est pas un repertoire valide';
exit;
}
//
$dir = opendir ($rep);
$contenu = array ();
//boucle
while (false !== ($fichier = readdir ($dir))) {
if ($fichier !== '..' && $fichier !== '.') {
$contenu[] = $fichier;
}
}
foreach($contenu as $cle => $element)
{
echo '<option value="',$fichier,'">',$fichier,'</option>';
}
?>