![]() |
![]() |
![]()
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: 115 Pomógł: 0 Dołączył: 3.05.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam!!!
mozesz sprobować najpierw zastąpić pierwsze literki tablicy (jesli sa polskie) np: ś -> sxzz, ć -> cxzz przesortować i potem spowrotem, ale to trochę naciągane i czaslochłonne. innych pomysłów nie mam ![]() -------------------- pozdrawiam bamboos
http://piorun.ds.pg.gda.pl/~ronek/log/jedyne.wma |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 8.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Nie zadobry pomysł, choć trafny
![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarząd Postów: 1 512 Pomógł: 2 Dołączył: 22.04.2002 Skąd: Koszalin ![]() |
posiedziałem trochę i oto jest mój pomysł na rozwiązanie Waszego problemu.
Mamy dwie tablice gdzie w jednej są wyrazy z polskimi literami zaś w drugiej bez polskich liter. Sortujemy druga tablicę (tą bez polskich) za pomoca funkcji asort() czyli należy przyczytać instrukcję. Następnie jest pętla do wyświetlenia posortowanej drugiej tablicy bez polskich znaków. Zamiast echo "$tablica2[$index]"; wstawiamy tablice z polskimi znakami gdzie zmienna $index określi który wyraz ma się wyświetlić. Przykład działania znajdziecie TUTAJ [php:1:6e967699f9] <?php $tablica[0]="słoń"; $tablica[1]="masło"; $tablica[2]="cień"; $tablica[3]="leżak"; $tablica2[0]="slon"; $tablica2[1]="maslo"; $tablica2[2]="cien"; $tablica2[3]="lezak"; asort($tablica2); foreach($tablica2 as $index => $polski) { echo "$tablica[$index] $polski<BR>"; } ?> [/php:1:6e967699f9] Zapewne ktoś zna lepszy sposób .... -------------------- brak sygnaturki rowniez jest sygnaturką
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 8.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki itsme. Podrasowałem trochę twój skrypt i wyszło mi coś takiego:
Kod <?
function sortowanie($tablica) { $i=0; foreach ($tablica as $wartosc) { $tablica2[$i] = strtr($wartosc, "ąćęłńśżźó", "acelnszxo"); $i++; } asort($tablica2); $i=0; foreach($tablica2 as $index => $xxx) { $tab[$i] = $tablica[$index]; $i++; } return $tab; } $tablica = sortowanie($tablica); //wyświetlenie posortowanej tablicy foreach ($tablica as $wartosc) { echo $wartosc; echo "<BR>"; } ?> Teraz trzeba tylko do funkcji sortowanie przekazać tablice i jest ok. Ale ja mam posortować tablice wielowymiarową. Muszę posiedzieć jeszcze nad tym skryptem i go ulepszyć. Jak to zrobię to umieszczę go tu. Swoją drogą to dziwne, że nikt nie ma na to gotowego projektu. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarząd Postów: 1 512 Pomógł: 2 Dołączył: 22.04.2002 Skąd: Koszalin ![]() |
Cytat $array[0]['name'] = "Niko";
zastosowalem rowniez taki kod
$array[0]['age'] = 24; $array[1]['name'] = "Dennis"; $array[1]['age'] = 34; //the fuction: function array_csort($marray, $column) { //coded by Ichier2003 foreach ($marray as $row) { $sortarr[] = $row[$column]; } array_multisort($sortarr, $marray); return $marray; } //just use it like that: $array = array_csort($array,"age"); [php:1:d8a36897dd]<?php function csort($array, $column){ $i=0; for($i=0; $i<count($array); $i++){ $sortarr[]=$array[$i][$column]; } array_multisort($sortarr, $array); return($array); } ?>[/php:1:d8a36897dd] Oba działąją pięknie -------------------- brak sygnaturki rowniez jest sygnaturką
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 36 Pomógł: 0 Dołączył: 8.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
itsme, czego wcześniej nie napisałeś, że ten twój kod działa też na polskie znaki, a ja tworzyłem swój
![]() Kod function sort_wielowymiar($tablica, $kolumna)
{ $i=0; foreach ($tablica as $wartosc) { $tablica2[$i] = strtr($wartosc[$kolumna], "ąćęłńśżźó", "acelnszxo"); $i++; } asort($tablica2); $i=0; $ile = count(array_keys($tablica[0])); foreach($tablica2 as $index => $xxx) { for ($x=0; $ile>$x; $x++) { $tab[$i][$x] = $tablica[$index][$x]; } $i++; } return $tab; } |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 296 Pomógł: 0 Dołączył: 9.05.2002 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat itsme, czego wcześniej nie napisałeś, że ten twój kod działa też na polskie znaki, a ja tworzyłem swój
![]() Ale to nie załatwia sprawy, bo po sortowaniu wyjdzie [php:1:63d9380a96]<?php $posortowane = array("łańcuch", "laska", "łękotka"); ?>[/php:1:63d9380a96] a powinno [php:1:63d9380a96]<?php $posortowane = array("laska", "łańcuch", "łękotka"); ?>[/php:1:63d9380a96] czy array_multisort() radzi sobie z tym? -------------------- audaces fortuna iuvat!
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Przyjaciele php.pl Postów: 786 Pomógł: 0 Dołączył: 18.03.2002 Skąd: Wroclaw/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Hej
@all: Olaboga.. Po co tak kombinowac ;) locale + strcoll Zapraszam: http://odothui.jukowski.com/t_79.php Pozdrawiam -------------------- .. make web your home ..
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ja również nie mogę sobie z tym poradzić. Czy ktoś z bardziej wprawionych programistów mógłby poświęcić trochę czasu, aby rozwiązać nasz problem? Z góry bardzo dziękuję.
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 296 Pomógł: 0 Dołączył: 9.05.2002 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Kurtz już sprawę wyjaśnił. :wink:
[php:1:c97ed4ebc2]<?php setlocale(LC_COLLATE, "pl_PL"); ?>[/php:1:c97ed4ebc2] -------------------- audaces fortuna iuvat!
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
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. Przecież pytałeś już jakiś czas temu o coś bardzo podobnego i dałem Ci wtedy gotowy skrypt bazujący na localach (praktycznie to samo rozwiązanie co podał teraz Kurtz). |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ten skrypt mi nie działa. Próbowałem użyć go na dwóch różnych serwerach, ale bez skutku. Zna ktoś może jakiś inny sposób?
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Przyjaciele php.pl Postów: 786 Pomógł: 0 Dołączył: 18.03.2002 Skąd: Wroclaw/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Hej
Cytat Ten skrypt mi nie działa. Próbowałem użyć go na dwóch różnych serwerach, ale bez skutku. Zna ktoś może jakiś inny sposób? sprawdz co zwraca funkcja setlocale. byc moze na serwerze gdzie testujesz rozwiazanei nie ma wogole polskich lokali albo wysteuje pod inna nazwa - np pl_PL.iso-8859-2 (home.pl bodjaze). Daj znac - jak to nie to bedziemy dalej kombinowali.
Pozdrawiam -------------------- .. make web your home ..
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Hmmm... Zrobiłem
echo (setlocale(LC_COLLATE, "pl_PL")); i pokazało się pl_PL. |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 83 Pomógł: 0 Dołączył: 31.03.2002 Skąd: Toruń Ostrzeżenie: (0%) ![]() ![]() |
Jeśli setlocale nic nie da, to spróbuj tego: [ link ] (pewnie zaraz zostanę obrzucony jajami, ale tym razem akurat to jest o tym
![]() -------------------- misiu | chór
"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku" Allen Holub |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Eh... Przeczytałeś dokładnie wszystkie posty? Prosiłem o skończony skrypt sortujący tablicę wielowymiarową...
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Przyjaciele php.pl Postów: 786 Pomógł: 0 Dołączył: 18.03.2002 Skąd: Wroclaw/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Hej
Cytat Hmmm... Zrobiłem
Skopiuj i wklej skrypt do ktorego adres podalem. Sortuje wg polskich znakow czy nie?
echo (setlocale(LC_COLLATE, "pl_PL")); i pokazało się pl_PL. Pozdrawiam -------------------- .. make web your home ..
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Nie.
|
|
|
![]()
Post
#21
|
|
![]() 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>'); ?> -------------------- misiu | chór
"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku" Allen Holub |
|
|
![]()
Post
#22
|
|
![]() Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 6.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 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ć :-|
Pisałem kiedyś, że pod windowsem może to nie działać bo locale to jest patent generalnie uniksowy. Stąd też było kiedyś moje pytanie, czy php pod windows rzeczywiście emuluje locale czy te funkcje (setlocale() i pochodne) są tylko zaślepkami, które nic nie robią. |
|
|
![]()
Post
#23
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Wieczorem posprawdzam, czy to działa. A jeśli chodzi o sortowanie z setlocale, to mam z tym duży problem. Niektóre litery wyświetla w dobrej kolejności, ale niektóre nie. Najgorsze jest to, że zamiast zwyczajnie przerzucać na sam koniec tablicy, to umieszcza je [elementy] gdzieś na środku.
|
|
|
![]()
Post
#24
|
|
![]() Grupa: Zarejestrowani Postów: 548 Pomógł: 2 Dołączył: 19.07.2003 Ostrzeżenie: (0%) ![]() ![]() |
witam ...
Cytat Pisałem kiedyś, że pod windowsem może to nie działać bo locale to jest patent generalnie uniksowy. Stąd też było kiedyś moje pytanie, czy php pod windows rzeczywiście emuluje locale czy te funkcje (setlocale() i pochodne) są tylko zaślepkami, które nic nie robią.
dziala ... mam ustawione: [php:1:fdabdeaa47]<?php setlocale(LC_ALL, "Polish"); ?>[/php:1:fdabdeaa47] na winxp pro eng i apache + mysql rowniez na eng i potem : [php:1:fdabdeaa47]<?php $data = strftime("%d %B [%A] - %Y", mktime() ); ?>[/php:1:fdabdeaa47] i dostaje piekna date z polskimi nazwami dni i miesiecy ... w ten sposob mozna spradzic czy dziala ... uwaga: ponizej sa linki ze wszystkimi kombinacjami kodow/oznaczen regionalnych ktore przyjmuje set locale ... trzeba sprawdzic ktore dzialaja bo sa zalezne od systemu operacyjnego ...: http://msdn.microsoft.com/library/default....age_strings.asp http://msdn.microsoft.com/library/default....try_strings.asp http://www.unicode.org/onlinedat/countries.html powinno dzialac ... cya |
|
|
![]()
Post
#25
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ech... Da mi ktoś w końcu dobry skrypt? Wszystkie poprzednie nie działają dobrze. Sortuję taką tablicę:
nazwa_polska||nazwa_oryginalna||liczba_plyt(int)||nazwa_pliku na przykład tym skryptem: [php:1:0e9e671f6e]<? function cmp ($a, $ ![]() usort($tablica, "cmp"); ?>[/php:1:0e9e671f6e] albo tym: [php:1:0e9e671f6e]<? function array_csort($marray, $column) { //coded by Ichier2003 foreach ($marray as $row) { $sortarr[] = $row[$column]; } array_multisort($sortarr, $marray); return $marray; } $tab = array_csort($tablica,0); ?>[/php:1:0e9e671f6e] Po wykonaniu przez serwer (digital.gda.pl) wyskakuje mi niby wszystko dobrze posortowane, ale prawie wszystkie elementy są podwójne, tzn. 007: Jutro nie umiera nigdy - 007: Tommorow Never Dies 1 CD 007: Jutro nie umiera nigdy - 007: Tommorow Never Dies 1 CD 007: Licencja na zabijanie - 007: Licence to Kill 2 CD 007: Licencja na zabijanie - 007: Licence to Kill 2 CD 007: Moonraker - 007: Moonraker 1 CD 007: Moonraker - 007: Moonraker 1 CD Nie wiem, co z tym zrobić... :cry: |
|
|
![]()
Post
#26
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Kurde :!:
Już chyba wiem, co było problemem ![]() Jeżeli coś jeszcze będzie nie tak, dam znać. A wy w tym czasie pogłówkujcie nad sortowaniem z polskimi znakami :wink:. |
|
|
![]()
Post
#27
|
|
![]() Grupa: Zarejestrowani Postów: 63 Pomógł: 0 Dołączył: 19.08.2003 Ostrzeżenie: (0%) ![]() ![]() |
Wszystko idzie super, ale mam mały problem. Jeżeli chciałbym zajrzeć do bazy i zmienić co nieco, wszystko się posypie. Potrzebuję edytora, który potrafiłby wstawiać na końcu wiersza znaki rn. Inaczej po mnie.
Ma ktoś takie cudeńko? :wink: |
|
|
![]()
Post
#28
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 18.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#29
|
|
![]() Developer Grupa: Moderatorzy Postów: 3 045 Pomógł: 290 Dołączył: 20.01.2007 ![]() |
~lukaszkkk masz licencje na odkopywanie? Zamykam.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:59 |