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;
}
{
$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;
}
{
$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?