webForumDet fria alternativet

Fel vid sortering av mappar med readdir

PHP

2 svar · 240 visningar · startad av Peloquin

Medlem sedan maj 20024 inlägg
Frågan#1

Jag har skrivit ett snuttigt litet program som på automagisk väg läser in alla bilder i underliggande mappar och visar upp dessa för besökaren. För att kunna navigera mellan olika bildbanker läser jag in mappnamnen med nedanstående kodsnutt och lägger in dem i en drop down list.
Problemet jag har när jag populerar en array med dessa namn för att loop-a genom dem, är att dessa inte går att sortera... sort funkar inte och det verkar ingen annan sorteringsfunktion heller...

Det stod nåt på se.php.net om att readdir tar in datan i den ordning de är skrivna på hårddisken... men det borde väl inte spela nån roll när jag skall sortera min array?
P.S: Det är fråga om en Debian GNU/Linux server med Apache/1.3.24, PHP 4.1.0 och Ext2 som filsystem.

<?
//Build up the drop down list and populate it
// Get the directory names
$homedir = ("."); // use "." for the current directory, or change this to the directory's name
$handle = opendir($homedir);

$i = 0;
//while (false !== ($dir = readdir($handle)))
while ($dir = readdir($handle))
{
    if ((is_dir($dir)) && ($dir != ".") && ($dir != ".."))
    {
        $list_of_dirs[$i] = $dir;
        sort ($list_of_dirs);
        reset ($list_of_dirs);
        echo "<option value=\"$list_of_dirs[$i]\" class=\"input2\">$list_of_dirs[$i]</option>\n";

        if ($picpaths == $list_of_dirs[$i])
		{
			$path = "pictures/$list_of_dirs[$i]";
			$i++;
		}
    }
}
?>
Medlem sedan aug. 20002 975 inlägg
#2

Som jag läser koden så skriver du ut efterhand du läser in i arrayen. Borde kanske läsa in allt, sortera och sedan skriva ut. Då kanske det kan gå med något liknande det här:

while ($dir = readdir($handle))
{
 	if ((is_dir($dir)) && ($dir != ".") && ($dir != ".."))
	{
	 	$list_of_dirs[$i] = $dir;
	}
}

sort ($list_of_dirs);

foreach ($list_of_dirs as $Value) 
{
 	echo "<option value=\"$Value\" class=\"input2\">$Value</option>\n";
	if ($picpaths == $Value)
	{
	 	$path = "pictures/$Value";
	}
}

Men samtidigt så förstår jag inte vad du gör med räknaren $i, så jag kanske fullständigt har missuppfattat vad du försöker göra.

Medlem sedan maj 20024 inlägg
#3

Nu funkar det som det skall...!

Tyvärr funkade inte Din lösning riktigt som jag hade tänkt, så jag knåpade på i ett par dagar och fick fram denna kodsnutt till slut:

<?
//Build up the drop down list and populate it
// Get the directory names
$homedir = ("."); // use "." for the current directory, or change this to the directory's name

$a = `find $homedir -maxdepth 1 -depth -type d -print`;
$dirs = explode ("\n", $a);
sort($dirs);

for ($i = 0; $i<=sizeof($dirs);$i++)
{
	if (($dirs[$i] != ".") && ($dirs[$i] != "..") && ($dirs[$i] != ""))
    {
    	$dirs[$i] = ereg_replace( "./", "", $dirs[$i] );
        echo "<option value=\"$dirs[$i]\" class=\"input2\">$dirs[$i]</option>\n";

	    if ($picpaths == $dirs[$i])
		{
			$path = "pictures/$dirs[$i]";
		}
    }
}
?>

Jag tog och skippade hela opendir / readdir balletten och använda mig av Linux find-kommando istället. Detta läser in mappnamnen i en array som jag sedan sorterar och skriver ut som drop down list.

Tack för hjälpen i alla fall!

252 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)