[PHP] arrays aanpassen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo mensen, ik heb een vraagje. Ik ben redelijk nieuw met arrays in php en zit dan ook al een lange tijd te kloten met een stukje code voor een archief-overzicht van nieuwsberichten. Maar misschien kan iemand me wat meer op weg helpen.

Ik heb een array met daarin verschillende data (uitgelezen uit database):

code:
1
2
3
4
5
6
7
8
Array
(
    [0] => 2006-03-05
    [1] => 2006-02-21
    [2] => 2006-02-14
    [3] => 2005-10-08
    [4] => 2004-05-25
)


Maar ik wil dit uiteindelijk omzetten naar een array die er als volgt uitziet:

code:
1
2
3
4
5
6
Array
(
    [2006] => 03, 02
    [2005] => 10
    [2004] => 05
)


Dus een array waarin uiteindelijk alleen de jaartallen als key staan met daarbij als values de maanden die voorkwamen bij dat jaartal. Zonder dubbele jaren en/of maanden.
Met die array wil ik dan uiteindelijk links maken naar nieuws uit een desbetreffende maand van een jaar.

Weet iemand hoe ik de array zo kan omzetten? Of welke functies ik hiervoor moet gebruiken?

[ Voor 11% gewijzigd door Verwijderd op 05-03-2006 15:34 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022

Reveller

Hopla!

Als je die laatste array wil, is het het beste om de data meteen via je query al te groeperen naar jaar. Vervolgens haal je deze resultset door een loop om de maanden aan de array-values toe te voegen, waarna je ze implode.

Overigens is het me onduidelijk wat je nu precies wilt. Ik denk dat je eerst eens goed moet overdenken wat je wil bereiken, want ik zie het praktische nut van die laatste array zo niet...succes!

Waarom haal je ook de dagen op uit je database als je ze verder toch niet gebruikt? Ik denk dat jij beter even naar de MySQL Date en Time functies kan kijken.

[ Voor 24% gewijzigd door Reveller op 05-03-2006 15:38 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Het is denk ik logischer en handiger om als resultaat iets te willen als;
PHP:
1
2
3
4
5
6
Array
(
    [2006] => Array("03", "02")
    [2005] => Array("10")
    [2004] => Array("05")
)


Dat is redelijk eenvoudig te bereiken door een functie te maken welke door je array loopt; het jaar-deel van de datum pakt, controleert of er al een key bestaat voor dat jaartal, en de maand toevoegd aan die key.

Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
$array = Array("2006-03-05","2006-02-21","2006-02-14","2005-10-08","2004-05-25");
$result = Array();
sort($array);
foreach($array as $value)
{
  $parts = explode("-",$value);
  if($result[$parts[0]][count($parts[0])-1]!=$parts[1]) $result[$parts[0]][] = $parts[1];
}
print_r($result);

De meest onduidelijke code ooit geschreven, maar dit is ongeveer hoe ik het zou doen.

Je krijgt als uitvoer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array
(
    [2004] => Array
        (
            [0] => 05
        )

    [2005] => Array
        (
            [0] => 10
        )

    [2006] => Array
        (
            [0] => 02
            [1] => 03
        )

)


Dit vervolgens omzetten naar jouw gewenste output:

PHP:
1
2
3
4
foreach($result as $year => $value)
{
  $result[$year] = implode(", ",$value);
}

[ Voor 82% gewijzigd door kunnen op 05-03-2006 16:04 ]


Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// init
$array = array('2006-03-05','2006-02-21','2006-02-14','2005-10-08','2004-05-25');

// iterate
foreach($array AS $datum) {
    
    $jaar = substr($datum,0,4);
    $maand = substr($datum,5,2);

    if(!isset($new[$jaar]))
        $new[$jaar] = array();

    if(!in_array($maand,$new[$jaar]))
        $new[$jaar][] = $maand;

}

[ Voor 43% gewijzigd door Verwijderd op 05-03-2006 15:57 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Pulsher schreef op zondag 05 maart 2006 @ 15:50:
De meest onduidelijke code ooit geschreven, maar dit is ongeveer hoe ik het zou doen.
Het zaakje wat leesbaarder maken is natuurlijk niet zo heel moeilijk. ;)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$array = array("2006-03-05","2006-02-21","2006-02-14","2005-10-08","2004-05-25");
$result = array();

foreach($array as $value)
{
  $date  = strtotime($value);
  $month = date('m', $date);
  $year  = date('Y', $date);

  if (!in_array($month, $result[$year]))
  {
    $result[$year][] = $month;
  }
}
print_r($result);

'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!

Verwijderd

Topicstarter
Ik heb ze allemaal ff geprobeerd. Bij allemaal kreeg ik output, maar soms klopte het niet helemaal, of kwam er nog een foutmelding bij terwijl er ook de goede output uitkwam :? (bij die van nme). Maar heb de goede combi kunnen vinden.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// init 
$array = array('2006-03-05','2006-02-21','2006-02-14','2005-10-08','2004-05-25'); 

// iterate  
foreach($array AS $datum) {  
      
    $jaar = substr($datum,0,4);  
    $maand = substr($datum,5,2);  

    if(!isset($new[$jaar]))  
        $new[$jaar] = array();  

    if(!in_array($maand,$new[$jaar]))  
        $new[$jaar][] = $maand;  

} 
print_r($new); 
//
foreach($new as $year => $value)  
{  
  $finalresult[$year] = implode(", ",$value);  
}  
print_r($finalresult);


Heel veel dank voor jullie hulp! :)

Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op zondag 05 maart 2006 @ 16:03:
[...]

Het zaakje wat leesbaarder maken is natuurlijk niet zo heel moeilijk. ;)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$array = array("2006-03-05","2006-02-21","2006-02-14","2005-10-08","2004-05-25");
$result = array();

foreach($array as $value)
{
  $date  = strtotime($value);
  $month = date('m', $date);
  $year  = date('Y', $date);

  if (!in_array($month, $result[$year]))
  {
    $result[$year][] = $month;
  }
}
print_r($result);
Bijzonder foutief.
Verwijderd schreef op zondag 05 maart 2006 @ 17:08:
Ik heb ze allemaal ff geprobeerd. Bij allemaal kreeg ik output, maar soms klopte het niet helemaal, of kwam er nog een foutmelding bij terwijl er ook de goede output uitkwam :? (bij die van nme).
En wat gaat er precies mis met de code die ik je eerder gaf?
'k Zeg niet dat ik perfect ben maar het stukje code heeft volgens mij wel een dergelijke werking ;-)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Oeh, ik ben vergeten om een array te initialiseren, wat jij wel doet op regel 10 en 11. Is daarom meteen het hele stuk code foutief? Ik wilde alleen een alternatief laten zien om de code leesbaarder te maken. ;)

'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!

Verwijderd

Topicstarter
Verwijderd schreef op zondag 05 maart 2006 @ 17:19:

En wat gaat er precies mis met de code die ik je eerder gaf?
'k Zeg niet dat ik perfect ben maar het stukje code heeft volgens mij wel een dergelijke werking ;-)
Als je goed kijkt is het ook jouw code die erin staat. Het enige dat ik heb gedaan is nog een stukje van Pulsher er bij aan geplakt zodat ik het uiteindelijke gewenste resultaat heb. Dus jouw code was goed. _/-\o_ :)

Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op zondag 05 maart 2006 @ 17:58:
[...]

Oeh, ik ben vergeten om een array te initialiseren, wat jij wel doet op regel 10 en 11. Is daarom meteen het hele stuk code foutief? Ik wilde alleen een alternatief laten zien om de code leesbaarder te maken. ;)
offtopic:
Snap ik, en snap ook dat jij normaliter ook je variabelen e.d. initiliseert maar als ik hier iets post doe ik in 9 van de 10 gevallen om iemand iets te leren en dan wil ik dat wel goed doen, inclusief initilisaties ;) Lijkt me een goede gedachte, toch?!


NOFI :>

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op zondag 05 maart 2006 @ 21:12:
offtopic:
Snap ik, en snap ook dat jij normaliter ook je variabelen e.d. initiliseert maar als ik hier iets post doe ik in 9 van de 10 gevallen om iemand iets te leren en dan wil ik dat wel goed doen, inclusief initilisaties ;) Lijkt me een goede gedachte, toch?!


NOFI :>
Klopt, maar mijn post was even snel geschreven zonder te checken of het wel werkte. :P Daarnaast lijkt het idee me redelijk duidelijk, en de notice die mijn code opleverde is ook redelijk eenvoudig te begrijpen en eruit te halen. ;)

Maar je hebt gelijk hoor. :*

'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!

Verwijderd

-NMe- schreef op zondag 05 maart 2006 @ 21:59:
[...]

Klopt, maar mijn post was even snel geschreven zonder te checken of het wel werkte. :P Daarnaast lijkt het idee me redelijk duidelijk, en de notice die mijn code opleverde is ook redelijk eenvoudig te begrijpen en eruit te halen. ;)

Maar je hebt gelijk hoor. :*
/me geeft -NMe- een hug en gaat met een goed gevoel - behalve in de tenen, na de sneeuwwandeling zojuist van 10 minuten - weer aan het werk
Pagina: 1