Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
python week
Avatar
Pavel Jirsák:16. června 8:50

Ahoj, potřebuji toto pole

Array ( [0] => Array ( [typ] => p [p] => Array ( [1] => Array ( [priorita] => 1 [id] => 1682895 [clovek] => osoba1 [typ] => p [hodiny] => 7:21 [nepritomnost] => [nepritomnostsku­pina] => 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 ( [typ] => o [o] => Array ( [1] => Array ( [priorita] => 1 [id] => 1683022 [clovek] => osoba1 [typ] => o [hodiny] => 11:31 [nepritomnost] => jiná instituce [nepritomnostsku­pina] => 2 [komentar] => [dochnep] => 10 [dochzmen] => 11:31 [dochip] => 192.168.0.3 [typ_trvani] => [dochuziv] => osoba1 [dochdat2] => [dochuziv2] => [dochzmen2] => [dochip2] => [dochcompname2] => [dochpozn] => [komentar_zapsal] => [sestava] => jiná instituce [schvaleno] => ano ) ) ) [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) [sestava] => ) ) [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] => [sestava] => jiná instituce [komentar] => neschválený brzký odchod [schvaleno] => schvalit ) ) ) ) 1

seřadit podle [hodiny]

Děkuji za radu

Zkusil jsem: ZKoušel jsem např. toto usort($test_array, function ($a, $b) { return $a['hodiny'] - $b['hodiny']; }); ale bez výsledku

 
Odpovědět
16. června 8:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16. června 13:07

1. Pouzivej pro vkladani kodu do fora tlacitko editoru 'code',

</>

2. provadej v php vypis pomoci pre,

<pre>

Takhle je to ted desne neprehledne.

 
Nahoru Odpovědět
16. června 13:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16. června 13:09
// 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] =>
            )
        )
    )
 
Nahoru Odpovědět
16. června 13:09
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16. června 13:16

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 :)
 
Nahoru Odpovědět
16. června 13:16
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16. června 13:24
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 :)
Editováno 16. června 13:24
 
Nahoru Odpovědět
16. června 13:24
Avatar
Pavel Jirsák:16. června 15:53

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 ) ) )
 
Nahoru Odpovědět
16. června 15:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17. června 8:22
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.

Editováno 17. června 8:24
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
17. června 8: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.