Autor | Zpráva | ||
---|---|---|---|
Enko Profil |
#1 · Zasláno: 1. 10. 2015, 14:34:59
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 |
#2 · Zasláno: 1. 10. 2015, 14:45:41
Enko:
usort / uasort + vlastni srovnávací funkce (tam by mělo stačit porovnávat jména pomocí strcmp ).
|
||
Enko Profil |
#3 · Zasláno: 1. 10. 2015, 17:36:06
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"); |
||
juriad Profil |
#4 · Zasláno: 1. 10. 2015, 17:47:42
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 |
#5 · Zasláno: 1. 10. 2015, 19:04:48
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. Děkuji |
||
juriad Profil |
#6 · Zasláno: 1. 10. 2015, 19:24:43
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 |
#7 · Zasláno: 1. 10. 2015, 19:44:19
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 |
#8 · Zasláno: 1. 10. 2015, 20:10:16
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 |
#9 · Zasláno: 2. 10. 2015, 15:10:37
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 :) |
||
Časová prodleva: 10 let
|
0