Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie a znaki Unicode
dreake
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.09.2008

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


Witam,

ostatnio dostałem do poprawy archaiczny serwis oparty na OSCommerce. Kolejną funkcjonalnością jaką dostałem do zrobienia ma być indeks autorów książek. Napisałem funkcję, która na podstawie tablicy nazwisk, tworzy alfabet (wybieram pierwsze literki, usuwam powtarzające sie i sortuje - sort()). Finalnie dostaję tablice literek na które są w bazie autorzy. Tzn brak pustych literek, na które nie ma autorów.

Kod
function theTrim(&$value)
{
    $value = trim($value);
}

function theFirst(&$value)
{
    $value = substr($value, 0, 1);
}

function theUpper(&$value)
{
    $value = strtoupper($value);
}

function getLettersFromRecords($records)
{
    $letters = array();
    foreach($records as $record)
    {
        $value = $record['products_extra_fields_value'];
        $recordData = explode(';', $value);
        array_walk($recordData, 'theTrim');
        if(substr($value, -1) == ';')
            array_pop($recordData);
        array_walk($recordData, 'theFirst');
        foreach($recordData as $rd)
        {
            $letters[] = (string) $rd[0];
        }
    }
    sort($letters);
    $letters = array_count_values($letters);
    $letters = array_keys($letters);
    
    array_shift($letters);
    array_walk($letters, 'theUpper');
    
    return $letters;
}


Napotkałem następujący problem. Otóż admin dodał autorów np. na Ł, Ś, Ć i wyrzuciło mi je za Z. No ba, normalne zachowanie, gdyz taka jest zasada działania funkcji sort(). Doczytałem, że można dodać opcje SORT_STRING czy lepsza w tym wypadku dla mnie SORT_LOCALE_STRING, ale to mi nic nie da bo o ile byłyby tylko polskie znaki diakrytyczne to dobrze, ale pojawili się autorzy tacy jak np. "Šebek Jaroslav". Za nic nie może mi do głowy przyjść rozwiązanie tego problemu.

Probowałem na siłę:

Kod
function stupidSort($array)
{
    $sorted = array();
    
    if(in_array("A", $array))
        $sorted[] = "A";
    if(in_array("Ą", $array))
        $sorted[] = "Ą";
    if(in_array("B", $array))
        $sorted[] = "B";
    if(in_array("C", $array))
        $sorted[] = "C";
    if(in_array("Ć", $array))
        $sorted[] = "Ć";
    if(in_array("D", $array))
        $sorted[] = "D";
    if(in_array("E", $array))
        $sorted[] = "E";
    if(in_array("Ę", $array))
        $sorted[] = "Ę";
    if(in_array("F", $array))
        $sorted[] = "F";
    if(in_array("G", $array))
        $sorted[] = "G";
    if(in_array("H", $array))
        $sorted[] = "H";
    if(in_array("I", $array))
        $sorted[] = "I";
    if(in_array("J", $array))
        $sorted[] = "J";
    if(in_array("K", $array))
        $sorted[] = "K";
    if(in_array("L", $array))
        $sorted[] = "L";
    if(in_array("Ł", $array))
        $sorted[] = "Ł";
    if(in_array("M", $array))
        $sorted[] = "M";
    if(in_array("N", $array))
        $sorted[] = "N";
    if(in_array("Ń", $array))
        $sorted[] = "Ń";
    if(in_array("O", $array))
        $sorted[] = "O";
    if(in_array("Ó", $array))
        $sorted[] = "Ó";
    if(in_array("P", $array))
        $sorted[] = "P";
    if(in_array("R", $array))
        $sorted[] = "R";
    if(in_array("S", $array))
        $sorted[] = "S";
    if(in_array("Ś", $array))
        $sorted[] = "Ś";
    if(in_array("Š", $array))
        $sorted[] = "Š";
    if(in_array("T", $array))
        $sorted[] = "T";
    if(in_array("U", $array))
        $sorted[] = "U";
    if(in_array("V", $array))
        $sorted[] = "V";
    if(in_array("W", $array))
        $sorted[] = "W";
    if(in_array("X", $array))
        $sorted[] = "X";
    if(in_array("Y", $array))
        $sorted[] = "Y";
    if(in_array("Z", $array))
        $sorted[] = "Z";
    if(in_array("Ź", $array))
        $sorted[] = "Ź";
    if(in_array("Ż", $array))
        $sorted[] = "Ż";
    
    return $sorted;
}


ale (nie znam się dobrze na sprawach związanych z encjami i kodowaniem) porównanie

Kod
in_array("Š", $tablica)


daje false. Probowałem też z encją zamiast Š ale też nie działa.

Czy ktoś może mi pomóc?
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jeżeli plik mam zapisany w utf-8 i cała stronę też to jakoś nie mam z tym problemu smile.gif
Ustaw wszędzie kodowanie utf-8 to pierwsza sprawa.
Druga sprawa to czy nie warto powierzyć sortowanie bazie?


--------------------
Go to the top of the page
+Quote Post
dreake
post
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.09.2008

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


Więc jeśli napewno będę miał kodowanie UTF-8 to wynikiem
Kod
in_array("Š", $tablica)

będzie true

Sprawdzałeś to?

Używam edytora Intype. Jaka jest różnica pomiędzy UTF-8 a UTF-8 Plain?

Jak to powierzyć je bazie? Co przez to rozumiesz?
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Tzn, że sortowanie powierzasz bazie. A potem robisz cos takiego.
Kod
$lettersTab=array();

foreach($records as $rec)
{
$letter=mb_strtolower($rec['tekst'][0],'utf-8');
if(!in_array($letter, $lettersTab))
{
$lettersTab[]=$letter;
}
}

Sprawdzałem. Edytor to ked-2;


--------------------
Go to the top of the page
+Quote Post
pyro
post
Post #5





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


  1. <?php
  2. function theTrim(&$value)
  3. {
  4.    $value = trim($value);
  5. }
  6.  
  7. function theFirst(&$value)
  8. {
  9.    $value = substr($value, 0, 1);
  10. }
  11.  
  12. function theUpper(&$value)
  13. {
  14.    $value = strtoupper($value);
  15. }
  16. ?>


po jaką cholere tworzysz funkcje ktore robia dokladnie to samo co funkcja wewnątrz funkcji tongue.gif?


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
dreake
post
Post #6





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 22.09.2008

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


Nie wiedziałem czy orginały zadziałają w array_walk(). Tam mam przez referencje.
Go to the top of the page
+Quote Post
pyro
post
Post #7





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


o sorry, nie czytalem calego i nie zauwazylem arrray walku


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 09:54