Avatar billede pissed_squirrel Nybegynder
09. marts 2014 - 18:10 Der er 5 kommentarer og
1 løsning

Array med Class objekt kondensering

Hej Eksperter

Jeg har sat mig overfor en udfordring, og jeg kan ikke lige finde ud af hvordan jeg skal løse den.

Jeg har dette i $Weekdays:

Array
(
    [0] => stdClass Object
        (
            [day] => Monday
            [openAt] => stdClass Object
                (
                    [From] => 05:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [1] => stdClass Object
        (
            [day] => Tuesday
            [openAt] => stdClass Object
                (
                    [From] => 05:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [2] => stdClass Object
        (
            [day] => Wednesday
            [openAt] => stdClass Object
                (
                    [From] => 05:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [3] => stdClass Object
        (
            [day] => Thursday
            [openAt] => stdClass Object
                (
                    [From] => 05:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [4] => stdClass Object
        (
            [day] => Friday
            [openAt] => stdClass Object
                (
                    [From] => 05:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [5] => stdClass Object
        (
            [day] => Saturday
            [openAt] => stdClass Object
                (
                    [From] => 06:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
    [6] => stdClass Object
        (
            [day] => Sunday
            [openAt] => stdClass Object
                (
                    [From] => 06:30
                    [To] => 22:00
                )
            [breaks] => stdClass Object
                (
                )
        )
)

Hvordan kan jeg kondensere det så jeg får dette output:

Monday - Friday (05:30-22:00)
Saturday - Sunday (06:30-22:00)

Pft.
Avatar billede HBP2 Praktikant
09. marts 2014 - 21:52 #1
Er det meningen at dagene skal grupperes efter dem som har samme From og To tid?

En nem måde at gruppere ting på, er at gemme dem i et assoc. array, hvor index er en eller anden kombination af de forskellige værdier, f.eks.:

$res = array();
foreach ($weekdays as $weekday) {
    $dayname = $weekday['day'];
    $from = $weekday['openAt']['From'];
    $to = $weekday['openAt']['To'];
    $res["$from-$to"][] = $dayname;
}

Så er alle dage med samme tider samlet i $res. Så skal du bare genererer lister ud fra disse.
Avatar billede arne_v Ekspert
09. marts 2014 - 22:13 #2
En primitiv udgave:


<?php
class Interval {
    public $from;
    public $to;
    public function __construct($from, $to) {
        $this->from = $from;
        $this->to = $to;
    }
}

class OpenDay {
    public $day;
    public $openAt;
    public function __construct($day, $openAt) {
        $this->day = $day;   
        $this->openAt = $openAt;   
    }
}

function aggregate($open) {
    $res = array();
    $first = $open[0]->day;
    for($i = 1; $i < 7; $i++) {
        if(($open[$i]->openAt->to != $open[$i-1]->openAt->to) ||
          ($open[$i]->openAt->from != $open[$i-1]->openAt->from)) {
            $last = $open[$i-1]->day;
            $res[] = new OpenDay($first . '-' .$last, $open[$i-1]->openAt);
            $first = $open[$i]->day;
        }
    }
    $last = $open[6]->day;
    $res[] = new OpenDay($first . '-' .$last, $open[6]->openAt);
    return $res;
}

$open = array();
$open[] = new OpenDay('Monday', new Interval('05:30', '22:00'));
$open[] = new OpenDay('Tuesday', new Interval('05:30', '22:00'));
$open[] = new OpenDay('Wednesday', new Interval('05:30', '22:00'));
$open[] = new OpenDay('Thursday', new Interval('05:30', '22:00'));
$open[] = new OpenDay('Friday', new Interval('05:30', '22:00'));
$open[] = new OpenDay('Saturday', new Interval('06:30', '22:00'));
$open[] = new OpenDay('Sunday', new Interval('06:30', '22:00'));

print_r($open);

$aggropen = aggregate($open);

print_r($aggropen);
?>

Avatar billede pissed_squirrel Nybegynder
11. marts 2014 - 08:22 #3
Det ser jo rigtig godt ud HBP2.

Jeg har ikke fået kigget din igennem Arne, og det virker lidt vildt at der skal så meget til?
Avatar billede arne_v Ekspert
12. marts 2014 - 00:32 #4
det er kun 15 linier

(resten er kun for at vise et komplet koerbart eksempel)
Avatar billede pissed_squirrel Nybegynder
24. marts 2014 - 18:08 #5
Kan i ikke begge smide et svar og så deler i pointene?
Avatar billede arne_v Ekspert
24. marts 2014 - 18:20 #6
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester