Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie a znaki Unicode
Forum PHP.pl > Forum > PHP
dreake
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?
wookieb
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?
dreake
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?
wookieb
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;
pyro
  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?
dreake
Nie wiedziałem czy orginały zadziałają w array_walk(). Tam mam przez referencje.
pyro
o sorry, nie czytalem calego i nie zauwazylem arrray walku
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.