Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Sortowanie elementów z kilku tablic równocześnie według własnego alfabetu
Forum PHP.pl > Forum > PHP
QooBooS
Witam.
Przy użyciu zwykłej funkcji sortowania tablic (array_multisort), kompilator posortował mi jej elementy alfabetycznie. Ja chciałbym nieco zmienić szyk tych elementów, tzn. tak jakby przenieść wcześniej w alfabecie niektóre znaki. Chciałbym, aby podkreślnik _ był przed literami (elementy nie zawierają polskich znaków).
Chciałbym też, aby razem z daną tablicą sortowały się w ten sam sposób inne tablice, czyli wypadałoby zamieszać w to funkcję array_multisort.
Aktualnie mam taki kod:
  1. $array_lowercase = array_map('strtolower', $name);
  2. array_multisort($array_lowercase, $name, $id, $body, $klasy);


Całość działałaby tak:
  1. $tablica = array("ala", "alo", "ali", "al_");

powinna zostać posortowana tak:
Kod
al_
ala
ali
alo

Znalazłem coś na ten temat na algorytmy.pl (sortowanie według własnego alfabetu), jednak strona jest płatna, a ja aktualnie nie mam tyle pieniędzy, żeby rozdawać je na prawo i lewo. Może wy coś poradzicie? Może funkcja uksort()? usort()?
Proszę pamiętać, że równolegle powinny się sortować cztery tablice, zachowując wszędzie taką samą kolejność w stosunku do stanu początkowego (czyli: jeśli element 1 z pierwszej tablicy idzie na trzecie miejsce, to to samo się dzieje z elementami '1' w pozostałych tablicach).
Zyx
usort()

To sortuje jedną tablicę naraz, ale przecież możesz ją kilka razy wywołać.

Ad. końcówki -> ech... sortowanie to jedne z podstawowych algorytmów, a algorytmy.pl nie są jedyną stroną o tym w sieci. Masz na pęczki artykułów o algorytmach sortowania we wszystkich językach świata.
QooBooS
Dobra, nawet jeśli mam dużo informacji na temat sortowania, to dalej nie wiem, jak ich użyć do własnego sortowania według zmodyfikowanego alfabetu. Skoro się wypowiedziałeś na ten temat, to założę się, że wiesz coś na ten temat. Może mógłbyś mi pomóc? Nakierować mnie, jakiej użyć funkcji, ewentualnie podać adres strony jakiegoś poradnika z takim rodzajem sortowania lub napisać to pseudokodem, podając nazwę funkcji? Niestety nie mam pojęcia jak się za to zabrać... Jeśli miałbym sortować tablice za pomocą pętli lub funkcji wykonującej to samo na kilku tablicach, to pewnie posortowałoby je oddzielnie, tzn. osobno sortując $name, osobno $klasy, itd. mnie natomiast chodzi o posortowanie jednej tablicy, na podstawie której sortują się pozostałe. Moje wymagania spełnia funkcja array_multisort, jednak nie pozwala ona (z tego, co wiem) na zdefiniowanie własnego sposobu (kolejności) sortowania.

EDIT:
Ja na razie mam taki kod:
  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. $xml = simplexml_load_file("new2.txt");
  4. $ile = count($xml -> string);
  5. foreach ($xml -> string as $value)
  6. {
  7. $id[] = (string)$value -> id;
  8. $name[] = (string)$value -> name;
  9. $body[] = (string)$value -> body;
  10. $klasy[] = (preg_match("/STR_SKILL_([a-z]{2})_(.+)/i", ((string)$value -> name ? preg_replace("/STR_SKILL_([a-z]{2})_(.+)/i", "\\1", (string)$value -> name) : "");
  11. }
  12. $array_lowercase = array_map('strtolower', $name);
  13. array_multisort($array_lowercase, $name, $id, $body, $klasy);
  14. $zapytanie = "";
  15. for($i=0; $i < $ile; $i++)
  16. {
  17. $dab = 0;
  18. $tekst = "";
  19. $tresc = "\"";
  20. $tekst .= "(\"".$id[$i]."\", \"".$name[$i]."\", \"".$klasy[$i]."\", \"".$body[$i]."\", ";
  21. $i++;
  22. if (preg_match("/(.+)_DESC_Abnormal$/i", $name[$i+1]))
  23. {
  24. $tekst .= "\"".$id[$i+1]."\", \"".$name[$i+1]."\", ";
  25. $tresc .= $body[$i+1]."=====";
  26. $dab = 1;
  27. } else if (preg_match("/(.+)_Abnormal$/i", $name[$i]) || preg_match("/(.+)_effect$/i", $name[$i]))
  28. {
  29. $tekst .= "\"".$id[$i]."\", \"".$name[$i]."\", ";
  30. $tresc .= $body[$i]."=====";
  31. } else {
  32. $tekst .= "\"\", \"\", ";
  33. }
  34. if (preg_match("/(.+)_DESC$/i", $name[$i]) || preg_match("/(.+)_area$/i", $name[$i]))
  35. {
  36. $tekst .= "\"".$id[$i]."\", \"".$name[$i]."\", ";
  37. $tresc .= $body[$i]."\")";
  38. if ($dab) $i++;
  39. } else {
  40. $tekst .= "\"\", ";
  41. $tresc .= "\")";
  42. }
  43. $tekst .= $tresc;
  44. $zapytanie .= "$tekst, ";
  45. }
  46. $query = "INSERT INTO sl_skille (`id_z_gry`, `name`, `klasa`, `nazwa_ang`, `id_z_gry_abnormal`, `name_abnormal`, `id_z_gry_desc`, `name_desc`, `opis_ang`) VALUES ". substr($zapytanie, 0, -2).";";
  47. print_r($name); echo "<br/><br/>";
  48. echo $query;
  49.  
  50. ?>


Działa on poprawnie, jednak sortowanie jest nieco inne, niż bym sobie tego życzył.
Wynikiem jest tablica zawierająca na przykład takie elementy:
  1. [30] => STR_ACH_StatupAr_Lr_Nr_Officer [31] => STR_ACH_StatupAr_Lr_Nr_Officer_Abnormal [32] => STR_ACH_StatupAr_Lr_Nr_Officer_DESC [33] => STR_ACH_StatupAr_Lr_Nr_OfficerF [34] => STR_ACH_StatupAr_Lr_Nr_OfficerF2 [35] => STR_ACH_StatupAr_Lr_Nr_OfficerF2_DESC [36] => STR_ACH_StatupAr_Lr_Nr_OfficerF_Abnormal [37] => STR_ACH_StatupAr_Lr_Nr_OfficerF_DESC [38] => STR_ACH_StatupAr_Lr_Nr_QuarterMaster

Zależy mi na tym, aby po 33 znalazł się 37, czyli aby najpierw sortowało F_ (lub po prostu coś zawierającego podkreślnik), a dopiero później resztę, czyli F2, itd.
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.