Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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: Setřídění multidimenzionálního pole

Aktivity
Avatar
Pavel Jirsák:16.6.2021 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.6.2021 8:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2021 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.6.2021 13:07
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2021 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.6.2021 13:09
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2021 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.6.2021 13:16
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2021 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.6.2021 13:24
 
Nahoru Odpovědět
16.6.2021 13:24
Avatar
Pavel Jirsák:16.6.2021 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.6.2021 15:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.6.2021 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.6.2021 8:24
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
17.6.2021 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.