Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Closed TopicStart new topic
> Sortowanie tablicy a polskie znaki
Myrek
post 2.05.2003, 23:58:47
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
bamboos
post 3.05.2003, 13:09:44
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 smile.gif


--------------------
Go to the top of the page
+Quote Post
Myrek
post 3.05.2003, 18:51:44
Post #3





Grupa: Zarejestrowani
Postów: 36
Pomógł: 0
Dołączył: 8.02.2003

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


Nie zadobry pomysł, choć trafny laugh.gif Myślę, że są inne rozwiązania tego problemu, może ktoś je zna?
Go to the top of the page
+Quote Post
itsme
post 3.05.2003, 20:36:21
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ą
Go to the top of the page
+Quote Post
Myrek
post 3.05.2003, 21:50:00
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.
Go to the top of the page
+Quote Post
itsme
post 3.05.2003, 22:28:22
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";
$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");
zastosowalem rowniez taki kod
[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ą
Go to the top of the page
+Quote Post
Myrek
post 3.05.2003, 23:56:32
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 biggrin.gif Też działa:
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;

}
Go to the top of the page
+Quote Post
zombie
post 13.08.2003, 11:01:41
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 biggrin.gif Też działa:

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!
Go to the top of the page
+Quote Post
kurtz
post 13.08.2003, 12:24:01
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 ..
Go to the top of the page
+Quote Post
Gonzo
post 1.09.2003, 17:35:18
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ę.
Go to the top of the page
+Quote Post
zombie
post 2.09.2003, 08:19:58
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!
Go to the top of the page
+Quote Post
Gonzo
post 2.09.2003, 16:55:06
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.
Go to the top of the page
+Quote Post
adwol
post 2.09.2003, 21:53:34
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).
Go to the top of the page
+Quote Post
Gonzo
post 3.09.2003, 12:57:37
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?
Go to the top of the page
+Quote Post
kurtz
post 3.09.2003, 15:17:47
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 ..
Go to the top of the page
+Quote Post
Gonzo
post 3.09.2003, 15:40:51
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.
Go to the top of the page
+Quote Post
msulik
post 3.09.2003, 22:46:52
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 tongue.gif )


--------------------
misiu | chór

"Zdeterminowany programista potrafi stworzyć fatalny kod w każdym języku"
Allen Holub
Go to the top of the page
+Quote Post
Gonzo
post 4.09.2003, 08:27:38
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ą...
Go to the top of the page
+Quote Post
kurtz
post 4.09.2003, 09:56:51
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

echo (setlocale(LC_COLLATE, "pl_PL"));

i pokazało się pl_PL.
Skopiuj i wklej skrypt do ktorego adres podalem. Sortuje wg polskich znakow czy nie?


Pozdrawiam


--------------------
.. make web your home ..
Go to the top of the page
+Quote Post
Gonzo
post 4.09.2003, 15:52:55
Post #20





Grupa: Zarejestrowani
Postów: 63
Pomógł: 0
Dołączył: 19.08.2003

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


Nie.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 4.05.2025 - 08:28