Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Sortowanie tablic w dwuwymiarowej tablicy według klucza
Shadowsword
post
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 5
Dołączył: 9.04.2008
Skąd: W-WA

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
TheaSiX
post
Post #2





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Shadowsword
post
Post #3





Grupa: Zarejestrowani
Postów: 149
Pomógł: 5
Dołączył: 9.04.2008
Skąd: W-WA

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Pewnie dołączasz ten plik parę razy.
Go to the top of the page
+Quote Post
TheaSiX
post
Post #5





Grupa: Zarejestrowani
Postów: 110
Pomógł: 10
Dołączył: 3.09.2006
Skąd: Bishop Auckland

Ostrzeżenie: (0%)
-----


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:)
Go to the top of the page
+Quote Post
pgrzelka
post
Post #6





Grupa: Zarejestrowani
Postów: 313
Pomógł: 24
Dołączył: 9.08.2008
Skąd: Kielce

Ostrzeżenie: (0%)
-----


ksort () ?
Go to the top of the page
+Quote Post
Maveral
post
Post #7





Grupa: Zarejestrowani
Postów: 45
Pomógł: 8
Dołączył: 30.07.2005

Ostrzeżenie: (0%)
-----


Jeśli on chce to posortować po nazwie pliku, to bardziej pasowało by "asort()".
Go to the top of the page
+Quote Post
Shadowsword
post
Post #8





Grupa: Zarejestrowani
Postów: 149
Pomógł: 5
Dołączył: 9.04.2008
Skąd: W-WA

Ostrzeżenie: (0%)
-----


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


Go to the top of the page
+Quote Post
Maveral
post
Post #9





Grupa: Zarejestrowani
Postów: 45
Pomógł: 8
Dołączył: 30.07.2005

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował Maveral 7.06.2009, 10:51:09
Go to the top of the page
+Quote Post
Shadowsword
post
Post #10





Grupa: Zarejestrowani
Postów: 149
Pomógł: 5
Dołączył: 9.04.2008
Skąd: W-WA

Ostrzeżenie: (0%)
-----


Wielkie dzięki, działa super. Teraz tylko mam pytanie jakie foreach napisać, żebym mógł coś zrobić oddzielnie z "plik", "artysta" i "tytul"?
Go to the top of the page
+Quote Post
erix
post
Post #11





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
żebym mógł coś zrobić oddzielnie z "plik", "artysta" i "tytul"?

Tzn? Chcesz to rozbić na osobne zmienne, czy tablice?
Go to the top of the page
+Quote Post
Shadowsword
post
Post #12





Grupa: Zarejestrowani
Postów: 149
Pomógł: 5
Dołączył: 9.04.2008
Skąd: W-WA

Ostrzeżenie: (0%)
-----


Na osobne zmienne. Będę to potem z tego robił tabelle html i plik xml, więc muszę to rozbić.
Go to the top of the page
+Quote Post
erix
post
Post #13





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




extract" title="Zobacz w manualu PHP" target="_manual?
Go to the top of the page
+Quote Post
Maveral
post
Post #14





Grupa: Zarejestrowani
Postów: 45
Pomógł: 8
Dołączył: 30.07.2005

Ostrzeżenie: (0%)
-----


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. ?>


(IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 04:22