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>');
?>