Avatar billede Slettet bruger
25. juli 2011 - 13:56 Der er 7 kommentarer og
1 løsning

Sortering af fil- og mappenavne

Jeg bruger følgende til at iterere en mappe samt alle undermapper:


<?php
function fd($directory) {
  $r_val = array();
   
  if ($handle = opendir($directory)) {
    while (false !== ($file = readdir($handle))) {
      if ($file != "." && $file != "..") {
        if (is_dir($directory. "/" . $file)) {
          $r_val = array_merge($r_val, fd($directory. "/" . $file));
          $file = $directory . "/" . $file . "/#dir#";
          $r_val[] = preg_replace("/\/\//si", "/", $file);
        } else {
          $file = $directory . "/" . $file;
          $r_val[] = preg_replace("/\/\//si", "/", $file);
        }
      }
    }

    closedir($handle);
  }

  return $r_val;
}

$upload_dir_full_path = $_SERVER["DOCUMENT_ROOT"]."/test";

$files = fd("$upload_dir_full_path");
natcasesort($files);

foreach ($files as $value) {
  $clean_value = str_replace($upload_dir_full_path."/", "", $value);

  if (strstr($clean_value, "/")) {
    if (strstr($clean_value, "#dir#")) {
      $directory_name = str_replace("/#dir#", "", $clean_value);
      echo $directory_name." (Mappe)<br>";
    } else {
      $filename = str_replace("/".$directory_name."/", "", $clean_value);
      echo $filename."<br>";
    }
  }
}
?>


Jeg vil gerne have mit array til at være som det er, dog med sortering således at output bliver med mapperne først og dernæst filnavnene.

Hvordan kan jeg gøre det?
Avatar billede olebole Juniormester
25. juli 2011 - 16:44 #1
<ole>

Du kunne hælde alle filer i ét array - og alle mapper i et andet. Du kan genkende filer med:
    http://www.php.net/manual/en/function.is-file.php

Når løkken er færdig, merger du de to arrays med:
    http://www.php.net/manual/en/function.array-merge.php

/mvh
</bole>
Avatar billede jakobdo Ekspert
25. juli 2011 - 16:50 #2
Prøv at kig på http://dk.php.net/glob
Avatar billede Slettet bruger
25. juli 2011 - 19:25 #3
olebole...>
Det overvejede jeg også, men mit problem er i forhold til undermapperne.

Hvordan holder jeg styr på en masse mapper og mange filer fordelt rundt omkring i undermapper?

Jeg var i gang med at lave noget lignede, men mit problem blev hele tiden at jeg ikke kender antallet af undermapper, og derfor kunne jeg ikke umiddelbart gennemskue hvordan jeg skulle løbe det igennem og få de echo'et korrekt.

jakobdo...>
Hvad kan glob gøre for mig som jeg ikke allerede gør?
Jeg kan sagtens identificere hvad der er filer og hvad der er mapper. Mit problem er at få den ønskede sortering i mit array.
Avatar billede jakobdo Ekspert
25. juli 2011 - 19:30 #4
Kan du ikke lave en rekursiv funktion?

Og glob() bare meget mere simpel at bruge, når man skal arbejde med filer og mapper.
Avatar billede Slettet bruger
25. juli 2011 - 20:18 #5
Fik det til at virke med denne:


<?php
function fd($directory) {
  $r_val = array();
  $d_array = array();
  $f_array = array();
   
  if ($handle = opendir($directory)) {
    while (false !== ($file = readdir($handle))) {
      if ($file != "." && $file != "..") {
        if (is_dir($directory. "/" . $file)) {
          $file = $directory . "/" . $file;
          $d_array[] = preg_replace("/\/\//si", "/", $file);
        } else {
          $file = $directory . "/" . $file;
          $f_array[] = preg_replace("/\/\//si", "/", $file);
        }
      }
    }

    closedir($handle);
    natsort($d_array);
    natsort($f_array);
  }
  foreach ($d_array as $value) {
    $r_val[] = $value."/#dir#";
    $r_val  = array_merge($r_val, fd($value. "/" . $file));
  }

  foreach ($f_array as $value) {
    $r_val[] = $value;
  }

  return $r_val;
}

$upload_dir_full_path = $_SERVER["DOCUMENT_ROOT"]."/test";

$files = fd("$upload_dir_full_path");

foreach ($files as $value) {
  $clean_value = str_replace($upload_dir_full_path."/", "", $value);

  if (strstr($clean_value, "#dir#")) {
    $directory_name = str_replace("/#dir#", "", $clean_value);
    echo $directory_name." (Mappe)<br>";
  } else {
    $filename = str_replace("/".$directory_name."/", "", $clean_value);
    echo $filename."<br>";
  }
}
?>



Kan i se nogle svagheder i opbygningen?

Uanset, læg et svar og pointene er jeres til deling for deltagelse i tråden.

Jeg havde en idé om at min rekursive funktion til at lave arrayet skulle organiseres anderledes, men tidligere i dag kunne jeg ikke få det opbygget rigtigt.
Avatar billede jakobdo Ekspert
25. juli 2011 - 20:20 #6
Springer over...
Avatar billede olebole Juniormester
25. juli 2011 - 21:21 #7
Jeg samler ikke points. Jeg tænkte ikke på glob(), da jeg skrev, men den vil jeg også klart foretrække
Avatar billede Slettet bruger
26. juli 2011 - 11:21 #8
Okay, jeg må prøve at kigge på at få den bygget ind i stedet for readdir.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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