Autor Zpráva
Enko
Profil
Ahoj,
mám následující pole:
$emp[0]["code"] = "1";
$emp[0]["name"] = "aleš";

$emp[1]["code"] = "2";
$emp[1]["name"] = "cecílie";

$emp[2]["code"] = "3";
$emp[2]["name"] = "bořek";

//a takto dále

A potřebuji nativně setřídit podle abecedy podle "name", tak aby byl výsledek následující:
$emp[0]["code"] = "1";
$emp[0]["name"] = "aleš";

$emp[2]["code"] = "3";
$emp[2]["name"] = "bořek";

$emp[1]["code"] = "2";
$emp[1]["name"] = "cecílie";

jak toho dosáhnout? Děkuji za každou radu :)
Kcko
Profil
Enko:
usort / uasort + vlastni srovnávací funkce (tam by mělo stačit porovnávat jména pomocí strcmp).
Enko
Profil
Kcko:
Děkuji za nápovědu. Už jsem to částečně vyřešil. Vše funguje bezvadně, pokud nejsou ty názvy vícebajtové (české znaky), podle kterých porovnávám. Zkusil jsem to takto:
SetLocale(LC_ALL, "cs_CZ");
mb_internal_encoding("UTF-8");

function mb_strcasecmp($str1, $str2, $encoding = null){
  if(null === $encoding){
    $encoding = mb_internal_encoding();
  }
  return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding));
}

function cmp($a, $b){
  return mb_strcasecmp($a["name"], $b["name"], $encoding = null);
}

usort($emp, "cmp");
Ale když je tam diakritika, tak mi to hodí až na konec. Například: Takže pokud mám: "Aleš", "Čeněk", "David". Tak výsledek je "Aleš", "David", "Čeněk". Ví někdo jak napsat takovéto porovnávání i pro UTF-8 pro češtinu?
juriad
Profil
Enko:
Takto to nejde, máš dvě možnosti:
1) diakritiku odstranit před porovnáním funckí iconv
2) použít collator, máš-li jej k dispozici
Viz stackoverflow.com/questions/14655092/comparing-utf-8-string
Enko
Profil
juriad:
Děkuji za odpověď.
ad1)Odstraňovat diakritiku není vhodné. Takže tato varianta nepřipadá v úvahu :-( tak jedině zbývá použít collator
ad2)Collator si můžu doinstalovat, ale nemám s tím zkušenosti. Když jsem pustil "apt-get install php5-intl" abych si tento balíček doinstaloval, tak mi to napsalo toto:
The following extra packages will be installed:
  libapache2-mod-php5 libicu48 php5-cgi php5-cli php5-common php5-gd php5-ldap php5-mysql php5-odbc php5-sqlite
Suggested packages:
  php-pear php5-suhosin
The following NEW packages will be installed:
  libicu48 php5-intl
The following packages will be upgraded:
  libapache2-mod-php5 php5-cgi php5-cli php5-common php5-gd php5-ldap php5-mysql php5-odbc php5-sqlite
9 upgraded, 2 newly installed, 0 to remove and 107 not upgraded.
Já chci ale jen doinstalovat ten intl. Je nějaká možnost jen samotná instalace intl? Jsem v tomto začátečník a nechci si přidělat hromadu zbytečné práce :-( Kdyžbych pustil tento příkaz, ugraduje se mi celé PHP... na jako u verzi? Na aktuální? Budu muset dělat znovu nastavení např ODBC, php.ini nebo jiné systémové nastavení? Mám to na Ubuntu 12.04.5 LTS. Budu rád i za nějaký odkaz či článek na toto téma.

Děkuji
juriad
Profil
Enko:
Na žádné konfiguráky by upgrade neměl sáhnout (ale Ubuntu neprovozuji). Jelikož php5-intl závisí na konkrétní verzi php5-common a v repozitáři máš nejspíš k dispozici jen nejnovější verzi php5-intl, musí se upgradovat php5-common a vše co na něm závisí.
Bude to nejspíš verze 5.3.10-1 (packages.ubuntu.com/precise-updates/php5-common); pokud teď máš verzi 5.3, nemusíš se ničeho bát.
Enko
Profil
juriad:
Skvělé... tak provedeno. Logy jsou OK. Vše se zdá že funguje v pohodě. Intl již tam mám. Tak zítra se vrhnu na ten zbytek. Děkuji :-)
juriad
Profil
Nejjednodušší řešení je toto (s anonymní funkcí a closure, aby se Collator nevytvářel zbytečně při každém porovnání znovu):
$c = new Collator('cs_CZ');
$c->setStrength(Collator::SECONDARY); # ignoruje velikost písmen

usort($emp, function($a, $b) use ($c) {
  return $c->compare($a["name"], $b["name"]);
});
Enko
Profil
juriad:
Vše funguje bezvadně. Děkuji i za živou ukázku s použitím collatoru. Funguje přesně podle představ.

Děkuji :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: