Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 8.02.2003 Ostrzeżenie: (0%)
|
Witam.
Mam problem z polskimi znakami podczas sortowania tablicy. Używam takiego kodu do sortowania: Kod function sortowanie($x, $y)
{ if ($x[1] == $y[1]) return 0; else if ($x[1] < $y[1]) return -1; else return 1; } usort($tablica, sortowanie); Skrypt sortuje "zwykłe" wyrazy w tablicy, a te zaczynające się na np. "ś", przerzuca na sam koniec tablicy. Wcale mu się nie dziwię, bo php nie wie gdzie w alfabecie znajduje się litera "ś". Czy jest jakiś sposób na poprawienie tego? Dzięki za odpowiedzi Pozdrawiam. |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 83 Pomógł: 0 Dołączył: 31.03.2002 Skąd: Toruń Ostrzeżenie: (0%)
|
Kurtz, mi to nie działa - sortuje tak, jakby polskie znaki znajdowały się za literą "z". Mam php 4.3.1 pod win więc powinno działać :-|
Gonzo, przepraszam bardzo, to się więcej nie powtórzy... Cytat Chciałbym prosić o gotowy kod, który posortowałby mi taką tablicę:
nazwa_polska||nazwa_oryginalna||liczba_plyt||nazwa_pliku według pierwszej kolumny. Jestem początkujący, więc mam nadzieję, że ten post nikogo nie rozzłości. Jeśli omawiany wyżej sposób (ten z `setlocale') polskiego sortowania jednowymiarowej tablicy działa Ci normalnie, to spróbuj tak: Kod <?php
// Wczytujemy plik do tablicy. /* Każda linia pliku jest postaci: nazwa_polska||nazwa_oryginalna||liczba_plyt||nazwa_pliku */ $linie = file ('plik.txt'); $n = count ($linie); // Zamieniamy elementy tablicy `$linie' na tablice. for ($i = 0; $i < $n; $i++) $linie[$i] = split ('||', rtrim($linie[$i])); // Teraz każdy element tablicy `$linie' jest tablicą czteroelementową. // Definiujemy funkcję porównującą. function mycmp ($a, $b) { // Funkcja `strcoll' to ta, która pojawiła się w omawianym // sposobie polskiego sortowania (patrz manual). // Porównujemy tylko pierwszą kolumnę. return (strcoll($a[0], $b[0])); // Funkcja `strcoll' jest `case sensitive', czyli rozróżnia znaki, // więc jeśli nie chcemy `case insensitive', trzeba napisać tak: /* return (strcoll(strtolower($a[0]), strtolower($b[0]))); */ } // I teraz to co było wcześniej. setlocale(LC_COLLATE, 'pl_PL'); // Stosujemy do sortowania naszą funkcję porównującą. usort($linie, 'mycmp'); reset($linie); // Wyświetlamy wynik. foreach ($linie as $linia) echo ($linia[0].','.$linia[1].','.$linia[2].','.$linia[3].'<br>'); ?> Powtarzam, u mnie nie działa polskie sortowanie zwykłej tablicy, ale ten sposób powinien działać, jeśli nie ma problemów z setlocale. Jeśli chodzi o moje rozwiązanie, które podałem w linku, można to zmodyfikować tak (to działa bez `setlocale'): Kod <html><head><meta http-equiv="Content-type" content="text/html; charset=windows-1250" /></head><body>
<?php $convArrayFromPL = array('ą'=>'a/', 'ć'=>'c/', 'ę'=>'e/', 'ł'=>'l/', 'ń'=>'n/', 'ó'=>'o/', 'ś'=>'s/', 'ź'=>'z!', 'ż'=>'z/', 'Ą'=>'A/', 'Ć'=>'C/', 'Ę'=>'E/', 'Ł'=>'L/', 'Ń'=>'N/', 'Ó'=>'O/', 'Ś'=>'S/', 'Ź'=>'Z!', 'Ż'=>'Z/'); $convArrayToPL = array (); foreach ($convArrayFromPL as $k => $v) $convArrayToPL[$v] = $k; function codeFromPL ($arg) { global $convArrayFromPL; $arg = preg_replace ('/([acelnoszACELNOSZ])/','1 ', $arg); return (strtr($arg, $convArrayFromPL)); } function codeToPL ($arg) { global $convArrayToPL; $arg = preg_replace ('/([acelnoszACELNOSZ])s/','1',$arg); return (strtr($arg, $convArrayToPL)); } // Wczytujemy plik do tablicy. $linie = file ('plik.txt'); // Zamieniamy elementy tablicy `$linie' na tablice. $n = count ($linie); for ($i = 0; $i < $n; $i++) { $linie[$i] = split ('||', rtrim($linie[$i])); // Kodujemy pierwszą kolumnę. $linie[$i][0] = codeFromPL($linie[$i][0]); } // Definiujemy funkcję porównującą. function mycmp ($a, $b) { // Porównujemy tylko pierwszą kolumnę. // Funkcja `strcmp' jest `case sensitive', czyli rozróżnia znaki, // więc jeśli nie chcemy `case insensitive', trzeba napisać tak: return (strcmp(strtolower($a[0]), strtolower($b[0]))); } // Stosujemy do sortowania naszą funkcję porównującą. usort($linie, 'mycmp'); // Dekodujemy. for ($i = 0; $i < $n; $i++) $linie[$i][0] = codeToPL($linie[$i][0]); reset($linie); // Wyświetlamy wynik. foreach ($linie as $linia) echo ($linia[0].','.$linia[1].','.$linia[2].','.$linia[3].'<br>'); ?> |
|
|
|
Myrek Sortowanie tablicy a polskie znaki 2.05.2003, 23:58:47
bamboos Witam!!!
mozesz sprobować najpierw zastąpić pierws... 3.05.2003, 13:09:44
Myrek Nie zadobry pomysł, choć trafny Myślę, że są inn... 3.05.2003, 18:51:44
It's_me posiedziałem trochę i oto jest mój pomysł na rozwi... 3.05.2003, 20:36:21
Myrek Dzięki itsme. Podrasowałem trochę twój skrypt i wy... 3.05.2003, 21:50:00
It's_me Cytat$array[0]['name'] = "Niko";
$array[0]['age'] ... 3.05.2003, 22:28:22
Myrek itsme, czego wcześniej nie napisałeś, że ten twój ... 3.05.2003, 23:56:32
zombie Cytatitsme, czego wcześniej nie napisałeś, że ten ... 13.08.2003, 11:01:41
kurtz Hej
@all: Olaboga.. Po co tak kombinowac ;) loca... 13.08.2003, 12:24:01
Gonzo Sortowanie 1.09.2003, 17:35:18
zombie Kurtz już sprawę wyjaśnił. :wink:
<?php
setlo... 2.09.2003, 08:19:58
Gonzo Sortowanie 2.09.2003, 16:55:06
adwol Re: Sortowanie 2.09.2003, 21:53:34
Gonzo Sortowanie 3.09.2003, 12:57:37
kurtz Re: Sortowanie 3.09.2003, 15:17:47
Gonzo Sortowanie 3.09.2003, 15:40:51
msulik Jeśli setlocale nic nie da, to spróbuj tego: [ lin... 3.09.2003, 22:46:52
Gonzo Sortowanie 4.09.2003, 08:27:38
kurtz Re: Sortowanie 4.09.2003, 09:56:51 
lukaszkkk Cytat(kurtz @ 4.09.2003, 10:56:51 ) H... 13.09.2008, 10:48:49
Gonzo Sortowanie 4.09.2003, 15:52:55
adwol Re: Sortowanie 4.09.2003, 16:07:30
Gonzo Sortowanie 4.09.2003, 16:35:33
orson Re: Sortowanie 4.09.2003, 20:38:50
Gonzo Sortowanie... 10.09.2003, 13:42:15
Gonzo Sortowanie... 10.09.2003, 15:35:09
Gonzo Edytor 11.09.2003, 08:27:53
webdice ~lukaszkkk masz licencje na odkopywanie? Zamykam. 14.09.2008, 11:40:01 ![]() ![]() |
|
Aktualny czas: 19.05.2026 - 13:46 |