Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie tablic w dwuwymiarowej tablicy według klucza
Forum PHP.pl > Forum > Przedszkole
Shadowsword
Witam!
Mam taką tablice:
Kod
Array
(
    [plik2.mp3] => Array
        (
            [plik] => plik2.mp3
            [artysta] => Shadowsword
            [tytul] => Fajna piosenka
        )

)
Array
(
    [plik1.mp3] => Array
        (
            [plik] => plik1.mp3
            [artysta] => Shadowsword
            [tytul] => Bardzo fajna piosenka
        )

)

I chciałbym ją posortować alfabetycznie według nazwy pliku, czyli żeby plik1.mp3 był przed plik2.mp3. Niestety, ale
Kod
array_multisort($my_array[plik], SORT_ASC, SORT_REGULAR);

zwraca pierdoły, czyli tablicę która poza tablicą [plik(numer).mp3] => array zwraca jeszcze pustą [plik]=>. Co muszę wpisać między nawiasem w multisort, aby posortowało tablice w odpowiedni sposób?
TheaSiX
spróbuj tego kodu podanego w komentarzach na php.net przez za@byza.it
  1. <?php
  2. function array_sort_func($a,$b=NULL) {
  3.   static $keys;
  4.   if($b===NULL) return $keys=$a;
  5.   foreach($keys as $k) {
  6.      if(@$k[0]=='!') {
  7.         $k=substr($k,1);
  8.         if(@$a[$k]!==@$b[$k]) {
  9.            return strcmp(@$b[$k],@$a[$k]);
  10.         }
  11.      }
  12.      else if(@$a[$k]!==@$b[$k]) {
  13.         return strcmp(@$a[$k],@$b[$k]);
  14.      }
  15.   }
  16.   return 0;
  17. }
  18.  
  19. function array_sort(&$array) {
  20.   if(!$array) return $keys;
  21.   $keys=func_get_args();
  22.   array_shift($keys);
  23.   array_sort_func($keys);
  24.   usort($array,"array_sort_func");      
  25. }
  26. ?>


Wywołaj funkcję:
  1. <?php
  2. array_sort($my_array, "kryterium1", "kryterium2");
  3. ?>
Shadowsword
Niestety, ale failed:
Cytat
Fatal error: Cannot redeclare array_sort_func() (previously declared in /xxx/tablica.php:37) in /xxx/tablica.php on line 37
erix
Pewnie dołączasz ten plik parę razy.
TheaSiX
a ja sprawdziłem ten kod na tej Twojej tablicy i jakoś dobrze mi posortowało, więc błąd musi być gdzie indziej (patrz wyżej:)
pgrzelka
ksort () ?
Maveral
Jeśli on chce to posortować po nazwie pliku, to bardziej pasowało by "asort()".
Shadowsword
Być może coś się zazębia w tym kodzie, przez to, że tablica jest tworzona w pętli i wygląda tak:
Kod
// Initialize getID3 engine
$getID3 = new getID3;

//running the while loop
while ($file = readdir($dir_handle))
{
if($file != '.' && $file != '..' && $file !='index.php')
   {
$filename = "/home/shadowsw/public_html/images/stories/dowcipy/".$file."";
$ThisFileInfo = $getID3->analyze($filename);
getid3_lib::CopyTagsToComments($ThisFileInfo);
$artist = ($ThisFileInfo['comments_html']['artist'][0]);
$tytul = ($ThisFileInfo['comments_html']['title'][0]);        
$my_array[$file]['plik'] = $file;
$my_array[$file]['artysta'] = $artist;
$my_array[$file]['tytul'] = $tytul;
}

echo "<pre>";
print_r($my_array);
echo "</pre>";
}

Ksort i asort zwracają błędy:
Cytat
Warning: ksort() expects parameter 1 to be array, null given in /home/shadowsw/public_html/tablica.php on line 40


Cytat
Warning: asort() expects parameter 1 to be array, null given in /home/shadowsw/public_html/tablica.php on line 40


Maveral
Jeśli Twoja tablica wygladała by tak jak w moim przykładzie, to posortowanie tego według nazwy nie było by problemem:

  1. <?php
  2.  
  3. $zm = array();
  4. $zm[plik2.mp3][plik] = "plik2.mp3";
  5. $zm[plik2.mp3][artysta] = "Shadowsword";
  6. $zm[plik2.mp3][tytul] = "Fajna piosenka";
  7. $zm[plik2.mp3][czas] = "3:14";
  8.  
  9. $zm[plik1.mp3][plik] = "plik1.mp3";
  10. $zm[plik1.mp3][artysta] = "Shadowsword";
  11. $zm[plik1.mp3][tytul] = "Bardzo fajna piosenka";
  12. $zm[plik1.mp3][czas] = "5:23";
  13.  
  14. //sortujemy
  15. asort ($zm);
  16.  
  17. //To tylko dla pokazania, że wyrzuca tablice.
  18. foreach ($zm as $v) {
  19.    print_r ($v);
  20.    echo "<BR />";
  21. }
  22.  
  23. //A tutaj wypisujemy posortowane wartości
  24. foreach ($zm as $v1) {
  25.    foreach($v1 as $v2) {
  26.    echo $v2;
  27.    echo " ";
  28.    }
  29.    echo "<BR />";
  30. }
  31.  
  32. ?>


Mam nadzieję, że o to ci chodzi winksmiley.jpg
Shadowsword
Wielkie dzięki, działa super. Teraz tylko mam pytanie jakie foreach napisać, żebym mógł coś zrobić oddzielnie z "plik", "artysta" i "tytul"?
erix
Cytat
żebym mógł coś zrobić oddzielnie z "plik", "artysta" i "tytul"?

Tzn? Chcesz to rozbić na osobne zmienne, czy tablice?
Shadowsword
Na osobne zmienne. Będę to potem z tego robił tabelle html i plik xml, więc muszę to rozbić.
Maveral
Osobne zmienne:

  1. <?php
  2. foreach ($zm as $v1)
  3. {
  4.    extract($v1, EXTR_PREFIX_ALL, "pref");
  5.    echo "$pref_plik, $pref_artysta, $pref_tytul, $pref_czas";
  6.    echo "<BR />";
  7. }
  8. ?>


winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.