webForumDet fria alternativet

Sortera dubbel-array?

10 svar · 656 visningar · startad av Quid

QuidMedlem sedan juni 20006 025 inlägg
#1

Min fillistning går framåt, men jag har stött på problem igen :)

<?php
$files = array();
if ($handle = opendir('./')) {
    while (false != ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && $file != "index.php") {
            $file_object = array(
				'name' => $file,
				'size' => round((filesize($file) / 1024), 1) . "k",
				'type' => substr($file, -3),
				'time' => date("Y-m-d H:i", filectime($file))
			);
			$files[] = $file_object;
        }
    }
    closedir($handle);
}

natcasesort($files[name]);

foreach($files as $fileinfo) {
	echo $fileinfo[type] . ", " . $fileinfo[name] . ", " . $fileinfo[time] . ", " . $fileinfo[size] . "<BR>";
}
?>

Där sorterar den som jag vill ha det, men det läggs till en rad utan värden på slutet (den skriver bara ut tre , (dvs. komma)), vilket det inte gör om jag tar bort "natcasesort($files[name]);".

Någon som vet varför det blir så och hur man löser det?

GunnarDMedlem sedan juni 20014 290 inlägg
#2

Om man stoppar in print_r($files); före och efter natcasesort så ser man att den inte plir sorterad.

<?php
$files = array();
if ($handle = opendir('./')) {
    while (false != ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && $file != "index.php") {
            $file_object = array(
                'name' => $file,
                'size' => round((filesize($file) / 1024), 1) . "k",
                'type' => substr($file, -3),
                'time' => date("Y-m-d H:i", filectime($file))
            );
            $files[] = $file_object;
        }
    }
    closedir($handle);
}
 
print_r($files);
natcasesort($files[name]);
print_r($files);
 ?>

Och man får warningar vid natcasesort() funktionen

$ php aaa.php 
Array
(
    [0] => Array
        (
            [name] => file10.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
    [1] => Array
        (
            [name] => aaa.php
            [size] => 0.7k
            [type] => php
            [time] => 2010-06-22 09:53
        )
 
    [2] => Array
        (
            [name] => file2.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
    [3] => Array
        (
            [name] => file1.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
)
PHP Notice:  Use of undefined constant name - assumed 'name' in aaa.php on line 19
PHP Warning:  natcasesort() expects parameter 1 to be array, null given in aaa.php on line 19
Array
(
    [0] => Array
        (
            [name] => file10.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
    [1] => Array
        (
            [name] => aaa.php
            [size] => 0.7k
            [type] => php
            [time] => 2010-06-22 09:53
        )
 
    [2] => Array
        (
            [name] => file2.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
    [3] => Array
        (
            [name] => file1.txt
            [size] => 0k
            [type] => txt
            [time] => 2010-06-22 09:14
        )
 
    [name] => 
)

Om du tittar här så kanske du får tipps på hur du skall lösa det: http://www.the-art-of-web.com/php/sortarray/ eller så kan man först sortera fillistan och sedan hämta information om resp. fil.

/red: fixade till koden lite.

QuidMedlem sedan juni 20006 025 inlägg
#3

Jag bytte ut:

natcasesort($files[name]);

till:

natcasesort($file_object[name]);

och då funkar sorteringen och jag får ingen extra rad, ocj det var ju egentligen den arrayn jag ville sortera :)

oskobMedlem sedan maj 20021 558 inlägg
#4

natcasesort($files[name]);

Vet inte riktigt vad du försöker uppnå med den raden? För det första borde du få en warning där php säger att "name" inte är en konstant och den kommer översätta det till strängen "name", alltså bli samma sak som att skriva natcasesort($files["name"]);

Och i så fall kommer ju $files["name"] vara tom. Namnen ligger ju i $files[0]["name"], $files[1]["name"] osv.

För att sortera mer komplexa saker än endimensionella arrayer är det nog usort() du får använda, typ såhär:

function mySort($a, $b)
{
	return strnatcmp($a['name'], $b['name']);
}

usort($files, "mySort");
oskobMedlem sedan maj 20021 558 inlägg
#5

Quid skrev:

Jag bytte ut:

natcasesort($files[name]);

till:

natcasesort($file_object[name]);

och då funkar sorteringen och jag får ingen extra rad, ocj det var ju egentligen den arrayn jag ville sortera :)

Det där går inte ihop i mitt huvud ett dugg :(
Du sorterar ju en array med bara 1 post? Har du kollat så filerna verkligen kommer i rätt ordning? I så fall får jag gå på kurs :P

GunnarDMedlem sedan juni 20014 290 inlägg
#6

Håller med oskob, $file_object innehåller bara sista filen och du sorteras denna filens information.

Om du tittar på mitt första inlägg så ser du att din array ser ut så här:

$files[0] => array(...);
$files[1] => array(...);
$files[2] => array(...);
$files[3] => array(...);

Och du sorterar $files (sorterar 0,1,2,3) inte på namn eller något annat.

Du måste nog använda tekniken jag länkade till tidigare ( http://www.the-art-of-web.com/php/sortarray/ ) och som även oskob hänvisade till.

Ett tips är att skriva "php aaa.php" så ser du direkt alla warningar som din kod genererar.

QuidMedlem sedan juni 20006 025 inlägg
#7

Jo, jag tänkte lite fel där uppe, men det blir rätt ändå, troligtvis pga. att det är en inställning på servern som sorterar på namn som jag vill, har ett asp-konto hos samma ställe och där sorteras det på datum.

Men det kan ju vara vettigt att sortera själv ändå, i fall detta ändras i framtiden.
Jag ska kolla upp era länkar lite senare.

QuidMedlem sedan juni 20006 025 inlägg
#8

oskob skrev:

function mySort($a, $b)
{
	return strnatcmp($a['name'], $b['name']);
}

usort($files, "mySort");

Då får man problemet med att filer med stora bokstäver kommer först, jag ändrade till:

natcasesort($files, "mySort");

Och då blir det rätt igen, men jag vet ju inte om det blir rätt pga. koden eller för att servern ändå sorterar som jag vill :p

metalboyMedlem sedan jan. 2005953 inlägg
#9

Quid skrev:

Då får man problemet med att filer med stora bokstäver kommer först, jag ändrade till:

natcasesort($files, "mySort");

Och då blir det rätt igen, men jag vet ju inte om det blir rätt pga. koden eller för att servern ändå sorterar som jag vill :p

natcasesort() tar bara ett argument, så det är inte koden som gör att det blir rätt då. Däremot kan du använda oskobs kod men med ett litet tillägg, om du använder strtolower() så slipper du problemet med att filer med versala tecken kommer före filer med gemener.

function mySort($a, $b)
{
	return strnatcmp(strtolower($a['name']), strtolower($b['name']));
}

usort($files, "mySort");
QuidMedlem sedan juni 20006 025 inlägg
#10

Lysande, tack för all hjälp!

CompusaMedlem sedan jan. 20023 327 inlägg
#11

Ett annat ord för "dubbel-array" är matris. :)

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)