Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie tablicy a polskie znaki
Myrek
post
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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
msulik
post
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>');



?>
Go to the top of the page
+Quote Post

Posty w temacie
- 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
- - msulik   Re: Sortowanie   4.09.2003, 16:00:36
- - 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


Closed TopicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.05.2026 - 13:46