[PHP]Array groeperen op data *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rommel
  • Registratie: Maart 2002
  • Laatst online: 16:32
Ik ben nu een tijdje aan het klooien met een array, maar ik kom er niet echt uit. Ik heb een array die eruit ziet als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Array
(
    [0] => Array
        (
            [id] => 1
            [title] => Blablabla
            [publishdate] => 2010-01-05 19:39:22
        )
    [1] => Array
        (
            [id] => 2
            [title] => Test
            [publishdate] => 2010-01-05 19:38:45
        )
    [2] => Array
        (
            [id] => 3
            [title] => Test bericht
            [publishdate] => 2010-01-05 19:37:39
        )
    [3] => Array
        (
            [id] => 4
            [title] => Test titel
            [publishdate] => 2009-12-28 16:40:17
        )
    [4] => Array
        (
            [id] => 5
            [title] => Test
            [publishdate] => 2009-12-10 15:45:36
        )
    [5] => Array
        (
            [id] => 6
            [title] => Test
            [publishdate] => 2009-12-10 15:47:36
        )
)

Ik wil de volgende tabel maken:
code:
1
2
3
4
5
6
7
8
9
Nieuws van 2010-01-05
- Blablabla
- Test
- Test bericht
Nieuws van 2009-12-28
- Test titel
Nieuws van 2009-12-10
- Test
- Test

Het gaat mij vooral om publishdate; ik krijg het niet echt voor elkaar om (zoals bovenstaande array & voorbeeld) te groeperen op plaatsingdata.

Ik zat zelf al te klooien om eerst de array te ontleden van de data's die in de array stonden, maar dan zat ik weer met welk item bij welke data hoort. Probeerde ook de array in een for lus te gooien maar ik krijg het niet voor elkaar om de items te groeperen per data. Kan iemand mij een duwtje in de goede richting geven? :?

Everything that has a beginning has a end


Acties:
  • 0 Henk 'm!

  • 0fbe
  • Registratie: Januari 2004
  • Laatst online: 20-09 07:25
Je kunt het beste een lege array aanmaken. Vervolgens begin je met record 1 van je huidige array. Je kijkt of nieuwe_array[publishdate] bestaat. zo ja dan doe je nieuwe_array[publishdate][] = titel. Zo nee dan doe je nieuwe_array[publishdate] = array(); En daarna nieuwe_array[publishdate][] = titel.

Zo dus
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
foreach ($array as $row)
{
    if(isset($nieuwe_array[substr($row[date],0,10)])
    {
        $nieuwe_array[substr($row[date],0,10)][] = $row[title];

    }
    else
    {
       $nieuwe_array[substr($row[date],0,10)] = array();
       $nieuwe_array[substr($row[date],0,10)][] = $row[title]; 
    }
}

[ Voor 37% gewijzigd door 0fbe op 08-01-2010 15:30 ]


Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Je kan de array doorlopen, een nieuwe array maken met de key van de oude array en als value de datum.

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 17:05

orf

Allereerst: Waar komt die array vandaan? Als het uit een database komt, dan kun je (veel) beter de sortering oplossen met een ORDER BY in je query.

In PHP kun je kijken naar array_multisort. Met behulp van de voorbeelden moet je een eind kunnen komen. :)

Edit: niet goed gelezen. Groeperen kun je beter oplossen met een nieuwe array inderdaad.

[ Voor 13% gewijzigd door orf op 08-01-2010 15:29 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
3
4
$newArray = array();
foreach ($array as $row)
  $newArray[date('Y-m-d', strtotime($row['publishdate']))][] = $row;
var_dump($newArray);

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Als je array al gesorteerd is op publishdate (zoals het geval lijkt te zijn) kun je er gewoon een keer doorheen lopen, en elke keer dat de dag veranderd een nieuwe header tussendoor printen:
code:
1
2
3
4
5
6
laatste_dag = ""
voor elk bericht:
    als dag_van(bericht.publishdate) != laatste_dag:
        laatste_dag = dag_van(bericht.publishdate)
        print "Nieuws van " + laatste_dag
    print " - " + bericht.title

Acties:
  • 0 Henk 'm!

Verwijderd

Je kan ook usort gebruiken en een custom sorteerfunctie schrijven die publishdate vergelijkt.

On second thought, ik zie dat je groeperen zegt in plaats van sorteren.
Dan sluit ik me aan bovenstaande.

[ Voor 27% gewijzigd door Verwijderd op 08-01-2010 15:28 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Titlefix:
[PHP]Array sorteren op data >> [PHP]Array groeperen op data
Get your terms straight. Zoekt makkelijker en maakt 't voor ons duidelijker wat je nou wil.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Die array ziet er uit alsof ie van een database komt. Ik denk dat het makkelijker is om daarin gewoon ORDER BY te gebruiken?

Daarna is het erg gemakkelijk: gewoon loopen door de resultset en als ie een nieuwe datum tegen komt start je een nieuw blok voor die datum.

Acties:
  • 0 Henk 'm!

  • Rommel
  • Registratie: Maart 2002
  • Laatst online: 16:32
RobIII schreef op vrijdag 08 januari 2010 @ 15:34:
Titlefix:
[PHP]Array sorteren op data >> [PHP]Array groeperen op data
Get your terms straight. Zoekt makkelijker en maakt 't voor ons duidelijker wat je nou wil.
Ow sorry voor de verwarring, in het topic zelf had ik het wel over groeperen maar in de titel schreef ik sorteren, was duidelijk toe aan het weekend. :O

Maar ik heb het eindelijk voor elkaar, vooral door de post van Soultaker en Simplendi! Om de data tijdelijk in een variabele op te slaan en deze te vergelijken met de waarde van een database item had ik niet kunnen bedenken.

Daarna wilde het nog steeds niet lukken, maar was de hele publishdate (dag-maand-jaar uur:minuut:seconde) aan het vergelijken, maarja dan is natuurlijk alles verschillend. Vergelijken op dag-maand-jaar werkt wat beter :+

Everything that has a beginning has a end


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

erwinrom schreef op zaterdag 09 januari 2010 @ 15:47:
Vergelijken op dag-maand-jaar werkt wat beter :+
Vergelijken op groot naar klein nog beter :+
Jaar -> Maand -> Dag -> Uur -> Minuut -> Seconde -> Nogkleineralsjevanheelprecieshoudt :+

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Rommel
  • Registratie: Maart 2002
  • Laatst online: 16:32
MueR schreef op zaterdag 09 januari 2010 @ 15:51:
[...]

Vergelijken op groot naar klein nog beter :+
Jaar -> Maand -> Dag -> Uur -> Minuut -> Seconde -> Nogkleineralsjevanheelprecieshoudt :+
Nog beter? Maakt toch niet veel uit of hij vergelijkt met bijvoorbeeld:
code:
1
01-01-2010 != 10-10-2010
dan:
code:
1
2010-01-01 != 2010-10-10

Tenminste, lijkt mij van niet... maar kan het mis hebben; sta altijd open voor optimalisaties :)

Everything that has a beginning has a end


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
MueR schreef op zaterdag 09 januari 2010 @ 15:51:
Jaar -> Maand -> Dag -> Uur -> Minuut -> Seconde -> Nogkleineralsjevanheelprecieshoudt :+
Jij bedoelt als je alle items wil ordenen op tijd, dan is het inderdaad een goed idee om eerst jaren te vergelijken, dan maanden, et cetera. Maar erwinrom wil alleen weten of twee items op dezelfde dag gepubliceerd zijn; in dat geval vergelijk je alleen de dag, maand en jaar, en de volgorde waarin je dat doet maakt geen fluit uit omdat ze toch allemaal gelijk moeten zijn. ;)
Pagina: 1