Avatar billede xenophobia Nybegynder
07. juni 2004 - 22:29 Der er 7 kommentarer og
2 løsninger

Sortering af array

Hej!

Jeg har et array, $filearray, hvori der ligger fil- og mappenavne, fx:

$filearray[0] => "fil.jpeg"
$filearray[1] => "Mappe"
$filearray[2] => "fil2.mpeg"

Min spørgsmål er så hvordan sorterer array'et så først kommer mapperne (i alfabetisk orden) og dernæst filerne (i alfabetisk orden).

Dvs:

$filearray[0] => "Mappe"
$filearray[1] => "fil.jpeg"
$filearray[2] => "fil2.mpeg"
Avatar billede the_ghost Nybegynder
07. juni 2004 - 22:43 #1
Du kan bruge sort(), men så bliver du nød til at dele arrayet op i 2 del arrays
Avatar billede xenophobia Nybegynder
07. juni 2004 - 22:47 #2
the_gost: Det ved jeg, men mit problem er at dele det op i 2 arrays. Det må kunne gøres på en eller anden smart måde.
Avatar billede the_ghost Nybegynder
07. juni 2004 - 22:48 #3
Hvis det ikke at alt for stort et array vi snakket om, så kan du jo dele det op, sortere det, og så smække det sammen i 1 igen!!!
Avatar billede detox Nybegynder
07. juni 2004 - 22:56 #4
Hvis vi går ud fra, du ikke bruger punktum i dine mappenavne:

foreach($filearray as $var) {
    if (strpos($var, '.') === false) $mapper[] = $var;
    else $filer[] = $var;
}
sort($mapper);
sort($filer);
$filearray = array_merge($mapper, $filer);
Avatar billede erikjacobsen Ekspert
07. juni 2004 - 22:59 #5
Det kan nu gøres som spørgeren ønsker - hvis vi antager at en mappenavn ikke indeholder et punktum, hvad det nu gerne må.

<?

  $files[]="mappe";
  $files[]="gmappe";
  $files[]="kfil.php";
  $files[]="xmappe";
  $files[]="bmappe";
  $files[]="vmappe";
  $files[]="ymappe";
  $files[]="Afil.php";
  $files[]="ffil.php";
  $files[]="Gfil.php";
  $files[]="efil.php";
  $files[]="amappe";
  $files[]="zfil.php";
  $files[]="qfil.php";

  function mysort($a,$b) {
    $a=strtolower($a);
    $b=strtolower($b);
    $a1=ereg('\.',$a);
    $b1=ereg('\.',$b);
    if ($a1 && !$b1) return 1;
    if ($b1 && !$a1) return -1;
    return strcmp($a,$b);
  }

  usort($files,'mysort');

  for ($i=0;$i<count($files);$i++) {
    print "$i {$files[$i]}<br>\n";
  }

?>
Avatar billede xenophobia Nybegynder
07. juni 2004 - 23:06 #6
Hej igen

Jeg så på Jeres svar og flettede dem ind i min kode således:

    $i=0;
    $s=0;
    while($file = readdir($dir)){
        If($file != "." && $file != ".."){
            $file_path = $current_dir . "/" . $file;
            If(filetype($file_path)=="dir"){
                $dirarray[$s] = $file;
                $s++;
            }
            else{
                $filearray[$i] = $file;
                $i++;
            }
        }
    }

    sort($filearray);
    reset($filearray);
    sort($dirarray);
    reset($dirarray);
    $filearray = array_merge($dirarray, $filearray);

Ved ikke om det noget slamkode, men det virker. Håber det er i orden i deler pointene (the_gost du var hurtigst og forklarede overordnet hvad teknikken var og detox du gav et udførligt eksempel)

erikjacobsen: Du kan forståeligt nok ikke huske mig, men tit og ofte (i Ekspertens unge dage) har du svaret på mine spørgsmål gratis og da jeg kan se du stadig gør det tager jeg endnu engang hatten af og roser dig for dit arbejde =)
Avatar billede detox Nybegynder
07. juni 2004 - 23:08 #7
sort($mapper);
sort($filer);

i mit eks kan evt. udskiftes med:

natcasesort($mapper);
natcasesort($filer);

alt efter hvordan du ønsker dem sorteret.
Men eriks løsning er nu osse ret elegant.
Avatar billede erikjacobsen Ekspert
07. juni 2004 - 23:08 #8
Det er klart bedst at bruge filetype, og ikke basere dig på at navnet siger om det
er en fil eller et katalog.

Næh, jeg husker nok ikke hvert og et spørgsmål jeg har svaret på i tidens løb ;)
Avatar billede detox Nybegynder
07. juni 2004 - 23:10 #9
Ja, klart bedre tilgang med filtype() :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester