Diskuze: Setřídění multidimenzionálního pole
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


1. Pouzivej pro vkladani kodu do fora tlacitko editoru 'code',
</>
2. provadej v php vypis pomoci pre,
<pre>
Takhle je to ted desne neprehledne.
// http://phillihp.com/toolz/php-array-beautifier/
[0] => Array (
[typ] => p
[p] => Array (
[1] => Array (
[priorita] => 1
[id] => 1682895
[clovek] => osoba1
[typ] => p
[hodiny] => 7:21
[nepritomnost] =>
)
)
)
[1] => Array (
[typ] => o
[o] => Array (
[1] => Array (
[priorita] => 1
[id] => 1683022
[clovek] => osoba1
[typ] => o
[hodiny] => 11:31
[nepritomnost] => jiná instituce
[nepritomnostskupina] => 2
[komentar] =>
)
)
)
[2] => Array (
[o] => Array (
[3] => Array (
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:16+02
[dochuziv] => nadrizeny
[id] => 1683022
[priorita] => 3
[clovek] => osoba1
[typ] => o
[hodiny] => 15:00:00
[schvaleno] => ano
[nepritomnost] => schváleno
[komentar] => provedl: Nadřízený, 11.06.2021 11:44
(105587)
)
)
[typ] => o
)
[3] => Array (
[typ] => o
[o] => Array (
[4] => Array (
[priorita] => 4
[id] => 145448
[clovek] => osoba1
[typ] => o
[hodiny] => 12:00
[nepritomnost] => zákonná přestávka
[komentar] => doplněno
provedl: Nadřízený, 11.06.2021 11:44
[dochnep] => 7
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:21
[dochuziv] => nadrizeny
[sestava] => zákonná přestávka: doplněno
)
)
)
[4] => Array (
[typ] => p
[p] => Array (
[4] => Array (
[priorita] => 4
[id] => 145449
[clovek] => osoba1
[typ] => p
[hodiny] => 12:30
[nepritomnost] => zákonná přestávka
[komentar] => doplněno
provedl: Nadřízený, 11.06.2021 11:44
[dochnep] => 7
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:21
[dochuziv] => nadrizeny
[sestava] => zákonná přestávka: doplněno
)
)
)
[5] => Array (
[typ] => o
[o] => Array (
[2] => Array (
[priorita] => 2
[clovek] => osoba1
[typ] => o
[nepritomnost] =>
)
)
)
Hm, tak to preji hodne stesti To pole obsahuje pokazde jine indexy ve strukture, takze se bude
obtizne probouravat k hodinam.
Pr.:
usort($test_array, function ($a, $b) { return $a['hodiny'] - $b['hodiny']; });
$a = $pole[0], $b = $pole[3];
$a =Array (
[typ] => p
[p] => Array (
[1] => Array (
[priorita] => 1
[id] => 1682895
[clovek] => osoba1
[typ] => p
[hodiny] => 7:21
[nepritomnost] =>
)
)
)
$b => Array (
[typ] => o
[o] => Array (
[4] => Array (
[priorita] => 4
[id] => 145448
[clovek] => osoba1
[typ] => o
[hodiny] => 12:00
[nepritomnost] => zákonná přestávka
[komentar] => doplněno
provedl: Nadřízený, 11.06.2021 11:44
[dochnep] => 7
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:21
[dochuziv] => nadrizeny
[sestava] => zákonná přestávka: doplněno
)
)
)
hodiny a = $a['p'][1]['hodiny']
hodiny b = $b['0'][4]['hodiny']
A pak mas taky hodiny jako string, takze nemuzes udelat proste a-b :)
function getHodiny($list)
{
foreach($list as $key=>$value1) {if ($key!=='typ') {break;}} // najdi prvni polozku, ktera neni [typ]
foreach($value1 as $value2) {break;} // najdi prvni polozku (at uz je to 0, 4 nebo cokoliv) a za predpokladu, ze tam neni vic nez jedna polozka
return $value2['hodiny']; // pozor, ale vraci to string '12:30'
}
usort($test_array, function ($a, $b) { return getHodiny($a) - getHodiny($b); }); // cili, hodiny takto odcitat nemuzes, ale tak prevod na integer si snad do te funkce uz doplnit zvladnes :)
Díky Peter, funkce getHodiny na uvedeném příkladu funguje výborně ale proč to nefunguje zde?
Array ( [0] => Array ( [0] => Array ( [priorita] => 1 [id] => 1682895 [clovek] => osoba1 [typ] => p [hodiny] => 7:21 [nepritomnost] => [nepritomnostskupina] => 1 [komentar] => [dochnep] => [dochzmen] => 7:21 [dochip] => 192.168.0.1 [typ_trvani] => [dochuziv] => osoba1 [dochdat2] => [dochuziv2] => [dochzmen2] => [dochip2] => [dochcompname2] => [dochpozn] => [komentar_zapsal] => [sestava] => ) ) [1] => Array ( [0] => Array ( [priorita] => 1 [id] => 1683022 [clovek] => osoba1 [typ] => o [hodiny] => 11:31 [nepritomnost] => jiná instituce [nepritomnostskupina] => 2 [komentar] => [dochnep] => 10 [dochzmen] => 11:31 [dochip] => 192.168.6.54 [typ_trvani] => [dochuziv] => osoba1 [dochdat2] => [dochuziv2] => [dochzmen2] => [dochip2] => [dochcompname2] => [dochpozn] => [komentar_zapsal] => [sestava] => jiná instituce [schvaleno] => ano ) [1] => Array ( [dochip] => 192.168.0.2 [dochzmen] => 2021-06-11 11:44:16+02 [dochuziv] => osoba2 [id] => 1683022 [priorita] => 3 [clovek] => osoba1 [typ] => o [hodiny] => 15:00:00 [schvaleno] => ano [nepritomnost] => schváleno [komentar] => provedl: nadrizeny, 11.06.2021 11:44
(105587) [sestava] => ) [2] => Array ( [priorita] => 4 [id] => 145448 [clovek] => osoba1 [typ] => o [hodiny] => 12:00 [nepritomnost] => zákonná přestávka [komentar] => doplněno
provedl: nadrizeny, 11.06.2021 11:44 [dochnep] => 7 [dochip] => 192.168.0.2 [dochzmen] => 2021-06-11 11:44:21 [dochuziv] => osoba2 [sestava] => zákonná přestávka: doplněno ) ) [2] => Array ( [0] => Array ( [priorita] => 4 [id] => 145449 [clovek] => osoba1 [typ] => p [hodiny] => 12:30 [nepritomnost] => zákonná přestávka [komentar] => doplněno
provedl: nadrizeny, 11.06.2021 11:44 [dochnep] => 7 [dochip] => 192.168.0.2 [dochzmen] => 2021-06-11 11:44:21 [dochuziv] => osoba2 [sestava] => zákonná přestávka: doplněno ) ) )
http://phillihp.com/toolz/php-array-beautifier/
[0] => Array (
[0] => Array (
[priorita] => 1
[id] => 1682895
[clovek] => osoba1
[typ] => p
[hodiny] => 7:21
[nepritomnost] =>
)
)
[1] => Array (
[0] => Array (
[priorita] => 1
[id] => 1683022
[clovek] => osoba1
[typ] => o
[hodiny] => 11:31
[nepritomnost] => jiná instituce
[nepritomnostskupina] => 2
[komentar] =>
)
[1] => Array (
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:16+02
[dochuziv] => osoba2
[id] => 1683022
[priorita] => 3
[clovek] => osoba1
[typ] => o
[hodiny] => 15:00:00
[schvaleno] => ano
[nepritomnost] => schváleno
[komentar] => provedl: nadrizeny, 11.06.2021 11:44
(105587)
)
[2] => Array (
[priorita] => 4
[id] => 145448
[clovek] => osoba1
[typ] => o
[hodiny] => 12:00
[nepritomnost] => zákonná přestávka
[komentar] => doplněno
provedl: nadrizeny, 11.06.2021 11:44
[dochnep] => 7
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:21
[dochuziv] => osoba2
[sestava] => zákonná přestávka: doplněno
)
)
[2] => Array (
[0] => Array (
[priorita] => 4
[id] => 145449
[clovek] => osoba1
[typ] => p
[hodiny] => 12:30
[nepritomnost] => zákonná přestávka
[komentar] => doplněno
provedl: nadrizeny, 11.06.2021 11:44
[dochnep] => 7
[dochip] => 192.168.0.2
[dochzmen] => 2021-06-11 11:44:21
[dochuziv] => osoba2
[sestava] => zákonná přestávka: doplněno
)
)
---
hodiny0-0 = $array[0][0]['hodiny'] //$a[0]['hodiny']
hodiny1-0 = $array[1][0]['hodiny']
hodiny1-1 = $array[1][1]['hodiny']
hodiny1-2 = $array[1][2]['hodiny']
hodiny2-0 = $array[2][0]['hodiny']
Ta funkce hleda prvni ne-typ index $a a v nem prvni index. $a[first
ne-typ][first].
To druhe pole ma jinou strukturu. Funkci si uprav na miru. Nebo, aspon muj dojem
je, ze jsem ti napovedel dost a ze taky neco musis zvladnout sam. Nebo si najmi
skutecneho programatora A
stejne nevim podminku pro tuhle novou situaci.
Problem je mozna v tom (jen hadam, protoze hadam asi jaky vysledek bys chtel...), ze sort prehazuje jen jednu vetev v root vetvi stromu. V tomto pripade vetev obsahuje vic nez jednu polozku obsahujici 'hodiny'. Takze, otazkou je, jake pravidlo se ma pouzit v takovem pripade?
- Bud treba takove pole preskladat na jednopolozkove. A to je otazka, zda by ti to pozdeji nedelalo nekde nejake potize. Ale bylo by to nej reseni. Nebo si z toho pole vybrat hodiny, id1, id2. A pak pouzit pro jiny sort.
- Nebo je treba upravit sort funkci jinak, aby nebyla a-b.
Jde o to, ze, za jake podminky se ma vymenit A s B, kdyz je tam vic polozek?
- kdyz nejvetsi z nich v A je mensi nez nejvetsi z nich v B
- nebo nejmensi?
- nebo prehodit kazdou z nich?
- nebo, jak jinak?
Pokud by slo o jednoduchou tabulku, tak bych si to pole preskladal na dvourozmrne pole
from
[
0=>[ 0=> old_array[0][0] ],
1=>[ 0=> old_array[1][0], 1=> old_array[1][1] ]...
]
to
[
[ index => [0, 0], hodiny => prevod_na_cislo('7:21'), data => old_array[0][0]] ,
[ index => [1, 0], hodiny => prevod_na_cislo('11:31'), data => old_array[1][0] ],
[ index => [1, 1], hodiny => prevod_na_cislo('15:00:00'), data => old_array[1][1] ]...
]
//A pak to muzes sortovat jako
usort($new_array, function ($a, $b) { return $a['hodiny'] - $b['hodiny']; }); // tvuj kod na zacatku
Tim padem tam mas indexy, hodiny a puvodni data.
Kdyz to sortnes, tak radky podle hodin budou ok. A pokud budes potrebovat vypsat
i indexy, tak je budes mit.
Ps. Navic je zarazejici, ze pouzivas hodiny 7:21 a 15:00:00. To je 7 hodin a
21 minut? A 15 hodin 0 min 0 sekund? nebo 15 dnu 0 hodin 0 minut? Pokud je to z
casoveho razitka, h:m:s, pak ok. Hlavne na to mysli pak u funkce, kterou ten
string konvertujes na hodiny
Jo, a zkus to pole formatovat pro forum pomoci stranky http://phillihp.com/…-beautifier/, aby vypadalo aspon tak, jak sem to z tama zkopiroval. Tam je krasne videt, ze v te vetvi mas vice radku s hodinami.
+20 Zkušeností
+2,50 Kč

Zobrazeno 7 zpráv z 7.