IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Avatar
Ondřej Langr (andysekcze):20.2.2017 19:46

Ahoj, mám pole, které vyvářím tímto způsobem

$out[] = [
        'time' => date('Y-m-d H:i:s',strtotime($data['time'])),
        'text' => $data['time'],
        'picture' => $data['url'],
];

a chtěl bych ho setřídit podle data a času. Nejjednodušší se mi zdálo třídit to podle timestampu. Avšak můj kód nefunguje.

public static function sortByDate(array &$array)
    {
        $output = [];
        foreach($array as $element)
        {
            $timestamps[] = strtotime($element['time']);
        }
        sort($timestamps, SORT_NUMERIC);
        array_reverse($timestamps);
        for($i = 0; $i == count($array); $i++)
        {
            foreach ($array as $element)
            {
                if (strtotime($element['time']) == $timestamps[$i])
                    $output[] = $element;
            }
        }
        return $output;
}

Po var_dump() funkce mi to vyhazuje prázdné pole. Neví někdo, kde je problém? :)

Editováno 20.2.2017 19:47
Odpovědět
20.2.2017 19:46
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Ondřej Langr (andysekcze):20.2.2017 23:17

Vyřešeno tímto způsobem

public static function sortByDate(array &$array, $ASC = null)
   {
       $output = [];
       foreach($array as $element)
       {
           $timestamps[] = strtotime($element['time']);
       }
       sort($timestamps, SORT_NUMERIC);
       foreach($timestamps as $timestamp){
           foreach ($array as $element)
           {
               if (strtotime($element['time']) == $timestamp)
                   $output[] = $element;
           }
       }
       if($ASC)
           return $output;
       else
           return array_reverse($output);
   }

Pokud znáte lepší, podělte se prosím :)

Nahoru Odpovědět
20.2.2017 23:17
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Matúš Petrofčík:20.2.2017 23:59

Lepšie by bolo použiť funkciu usort (kliknutím sa dostaneš na dokumentáciu).

V tvojom prípade by mohol skript vyzerať takto nejako:

<?php
function compareByTime(array $a, array $b) {
        if ($a["time"] == $b["time"]) return 0;
        return $a["time"] < $b["time"] ? -1 : 1;
}

usort($array, "cmp_by_optionNumber");

u verzie 5.3+ je možné použiť anonymnú funkciu

<?php
usort($array, function (array $a, array $b) {
        if ($a["time"] == $b["time"]) return 0;
        return $a["time"] < $b["time"] ? -1 : 1;
});

Prípadne tu je celkom dobré riešenie: http://stackoverflow.com/a/2477524

Kód som netestoval, ak by nefungoval správne skús opačné znamienko pri porovnávaní :D

Za zmienku možno stojí aj uasort a uksort

Editováno 21.2.2017 0:02
Nahoru Odpovědět
20.2.2017 23:59
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Matúš Petrofčík:21.2.2017 0:05

Jo a z $a['time'] si urob porovnateľnú hodnotu, napr. timestamp číslo. Neviem či to PHP takto samo zvládne skonvertovať zo stringu, no ale to si vyskúšaš :)

Nahoru Odpovědět
21.2.2017 0:05
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Matúš Petrofčík:21.2.2017 15:56

U toho prvého príkladu v 3. komentári som urobil chybku :D

<?php
function compareByTime(array $a, array $b) {
        if ($a["time"] == $b["time"]) return 0;
        return $a["time"] < $b["time"] ? -1 : 1;
}

usort($array, "compareByTime"); // správny názov funkcie ktorú máme zavolať, preto sa mi skôr páči ten druhý príklad s anonymnou funkciou...

Skúsil si to teda či ani nie? :)

Nahoru Odpovědět
21.2.2017 15:56
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Ondřej Langr (andysekcze):21.2.2017 17:59

něco podobného jsem již zkoušel, bohužel neúspěšně, ale mrknu na to až budu mít víc času :)

Nahoru Odpovědět
21.2.2017 17:59
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Odpovídá na Ondřej Langr (andysekcze)
Matúš Petrofčík:4.3.2017 20:41

Čau, tak čo, skúsil si ten môj spôsob? Príde mi to viac "pretty" než to tvoje :D

Nahoru Odpovědět
4.3.2017 20:41
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Nahoru Odpovědět
4.3.2017 20:59
I have a charger. I have Note 7. Umh I haven't Note7.
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 8 zpráv z 8.