NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – sort - Český PHP manuál

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jan Zamecnik
Člen
Avatar
Jan Zamecnik:4.9.2016 21:22

Ahoj, Jak by se prosím udělal sort vícerozměrného pole například podle druhého sloupečku? Je na to speciální funkce?
Díky Honza

 
Odpovědět
4.9.2016 21:22
Avatar
arnost99
Člen
Avatar
arnost99:2.12.2016 23:49

Jde to, ideálně napsat svou funkci, pěkně popsané zde (neodzkoušené) - https://paulund.co.uk/…-array-value a popis jak třídit pole taky tady: http://php.net/….sorting.php. Je to hodně o tom, co chceš třídit a jak :)

 
Odpovědět
2.12.2016 23:49
Avatar
Odpovídá na Jan Zamecnik
Zdeněk Burian:8.11.2019 8:48

Na vícerozměrné pole to se dá použít array_multisort. Pokud je třeba třídit české znaky, je třeba nejdřív napsat:
setlocale(LC_ALL, 'cs_CZ.UTF-8');
array_multisort( array_column($pole, "sloupec"), SORT_LOCALE_STRING, $pole );

 
Odpovědět
8.11.2019 8:48
Avatar
M Ark
Člen
Avatar
M Ark:9.1.2022 21:34

Zdravím, narazil jsem na problém, který ani po intenzivním gůglení pro mě nemá uspokojivé řešení: třídění hodnot pole(string) česky.

$a=array("Čela","Cela","Ďýky","Dýky","Ňykdy","Nikdy","Šuk","Suk","Řek","Rek","Žebra","Zebra");
print_r($a);
setlocale(LC_COLLATE, 'cs_CZ.utf8');
sort($a,SORT_LOCALE_STRING);
print_r($a);

a leze z toho:
Array ( [0] => Čela [1] => Cela [2] => Ďýky [3] => Dýky [4] => Ňykdy [5] => Nikdy [6] => Šuk [7] => Suk [8] => Řek [9] => Rek [10] => Žebra [11] => Zebra )
Array ( [0] => Cela [1] => Dýky [2] => Nikdy [3] => Rek [4] => Suk [5] => Zebra [6] => Čela [7] => Ďýky [8] => Ňykdy [9] => Řek [10] => Šuk [11] => Žebra )

poradíte, kde bych našel elegantní a funkční řešení?
Ďýky M

 
Odpovědět
9.1.2022 21:34
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na M Ark
Peter Mlich:27.5.2022 11:31

Na jedne strance doporucuji pouzit colator. $collator = new Collator(); Ale, mne to teda nefunguje, asi nemam tu class implementovanou.
Asi jedinou moznosti je vytvorit si prevodni funkci s UTF8 znaky ve spravnem poradi. Tady prikladam seznma utf znaku, ktere pouzivam pro konverzi pro odstraneni diakritiky.

$utf8  = explode(",", "á,ä,à,ã,â,ć,č,ď,é,ě,ë,è,ê,í,ï,ì,î,ĺ,ľ,ń,ň,ñ,ó,ô,ò,õ,ö,ő,ŕ,ř,ś,š,ť,ú,ù,ů,ü,ũ,û,ý,ź,ž,Á,Ä,À,Ã,Â,Ć,Č,Ď,É,Ě,Ë,È,Ê,Í,Ï,Ì,Î,Ĺ,Ľ,Ń,Ň,Ñ,Ó,Ô,Ò,Õ,Ö,Ő,Ŕ,Ř,Ś,Š,Ť,Ú,Ù,Ů,Ü,Ũ,Û,Ý,Ź,Ž");   // utf8

A vic by mne zajimalo razeni pro multidimenzionalni pole :) Tam se mi SORT_LOCALE_STRING nepodarilo nacpat.

 
Odpovědět
27.5.2022 11:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.5.2022 12:33
<?php
// utf-8 sort in multi-dimensional array on column 0 ($a[0], $b[0])
// May be not fast, but workable :)
// 1. get mb_char from A, from B
// 2. find position in $utf8_for_sorting

$utf8_for_sorting  = "aáäàãâAÁÄÀÃÂbBcćčCĆČdďDĎeéěëèêEÉĚËÈÊfFgGhHiíïìîIÍÏÌÎjJkKlĺľLĹĽmMnńňñNŃŇÑoóôòõöőOÓÔÒÕÖŐpPqQrŕřRŔŘsśšSŚŠtťTŤuúùůüũûUÚÙŮÜŨÛvVwWxXyýYÝzźžZŹŽ";    // utf8

function cmpUtf8($a, $b)
        {
        global $utf8_for_sorting;
        $len_a = mb_strlen($a[0], 'UTF-8');
        $len_b = mb_strlen($b[0], 'UTF-8');
        $len = $len_a<$len_b ? $len_a : $len_b;
        $pos_a = $pos_b = 0;
        for ($i=0; $i<$len; $i++)
                {
                $pos_a = mb_strpos($utf8_for_sorting, mb_substr($a[0], $i, 1));
                $pos_b = mb_strpos($utf8_for_sorting, mb_substr($b[0], $i, 1));
                if ($pos_a!=$pos_b) {return $pos_a-$pos_b;}
                }
        }

$list = array(
        array("Österreich", 'something'),
        array("Osterreich", 'something'),
        array("Zeta", 'something')
);

usort($list, 'cmpUtf8');
print_r($list);
?>

Array (
[0] => Array ( [0] => Osterreich [1] => something )
[1] => Array ( [0] => Österreich [1] => something )
[2] => Array ( [0] => Zeta [1] => something )
)
 
Odpovědět
27.5.2022 12:33
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:27.5.2022 13:22

a uprava kvuli pismenu CH
Cili, kdyz je to C nebo C, tak precti dalsi znak a kdyz je to 'ch', pos=42.4, kdyz je to 'Ch' nebo 'CH', pos=42.8 a 'cH' je povazovan za nesmysl

<?php
                $chr_a = mb_substr($a[0], $i, 1);
                $chr_b = mb_substr($b[0], $i, 1);
                if ($i<$len)
                        {
                        if     ($chr_a=='c') {$next = mb_substr($a[0], $i+1, 1); if ($next=='h') {$pos_a = 42.4;}}
                        elseif ($chr_a=='C') {$next = mb_substr($a[0], $i+1, 1); if ($next=='h' || $next=='H') {$pos_a = 42.8;}}
                        else    {$pos_a = mb_strpos($utf8_for_sorting, $chr_a);}
                        if     ($chr_b=='c') {$next = mb_substr($b[0], $i+1, 1); if ($next=='h') {$pos_b = 42.4;}}
                        elseif ($chr_b=='C') {$next = mb_substr($b[0], $i+1, 1); if ($next=='h' || $next=='H') {$pos_b = 42.8;}}
                        else    {$pos_b = mb_strpos($utf8_for_sorting, $chr_b);}
                        }
                else    {
                        $pos_a = mb_strpos($utf8_for_sorting, $chr_a);
                        $pos_b = mb_strpos($utf8_for_sorting, $chr_b);
                        }
                if ($pos_a!=$pos_b) {return $pos_a - $pos_b;}
                return $len_a - $len_b;
 
Odpovědět
27.5.2022 13:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.