Trädvy Permalänk
Medlem
Plats
Uddevalla
Registrerad
Nov 2002

Php arrays

Hej!

Jag vill printa ut de månader som finns för det året ur en array.

<?php $months = array( 1=>'januari', 2=>'februari', 3=>'mars', 4=>'april', 5=>'maj', 6=>'juni', 7=>'juli', 8=>'augusti', 9=>'september', 10=>'oktober', 11=>'november', 12=>'december'); /* foreach($months as $month){ $month = strtr($month,$months); } */ $years1 = array( '2013' => array('1','2','3','4','5','6','7','8','9','10','11','12'), '2014' => array('1','2','3','4','5','6','7','8','9','10','11','12'), '2015' => array('1','2','3','4','5','6','7','8','9','10'), '2016' => array('4','5') ); echo var_dump($years1); $years = array('2013', '2014', '2015'); $data = new stdClass; foreach($years as $year){ $data->$year = $months; } foreach($data as $year => $months) { echo '<b>Year: '.$year.'</b><br>'; foreach($months as $month) { echo 'Month: '.$month.'<br>'; } } ?>

$years1 tror jag har rätt struktur, men jag vet inte 100% för jag är uppriktigt sagt kass på arrays och stdklasser.

Men jag vill i alla fall printa ut alla månaderna som finns under respektive år, i arrayn.

2013
jan
..
dec
2014
jan
..
dec
2015
jan
..
okt
2016
april
maj

Så det är de här badboysen jag behöver hjälp med:

$data = new stdClass; foreach($years as $year){ $data->$year = $months; } foreach($data as $year => $months) { echo '<b>Year: '.$year.'</b><br>'; foreach($months as $month) { echo 'Month: '.$month.'<br>'; } }

(tror jag)

Är inte linux en billig kopia av ms-dos?

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002

@akn3: Om du bara vill skriva ut månadsnamnen för de månader som tillhör respektive år så räcker det att loopa över listorna:

$monthName = [ 1 => "januari", 2 => "februari", 3 => "mars", 4 => "april", 5 => "maj", 6 => "juni", 7 => "juli", 8 => "augusti", 9 => "september", 10 => "oktober", 11 => "november", 12 => "december", ]; $monthsForYear = [ 2013 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 2014 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 2015 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 2016 => [4, 5], ]; $yearsToPrint = [2013, 2014, 2015, 2016]; foreach($yearsToPrint as $yearNum) { printf("<b>Year: %d</b><br/>", $yearNum); foreach($monthsForYear[$yearNum] as $monthNum) { printf("Month: %s<br/>", $monthName[$monthNum]); } print "<br/>"; }

Exempel

Year: 2013 Month: januari Month: februari Month: mars Month: april Month: maj Month: juni Month: juli Month: augusti Month: september Month: oktober Month: november Month: december Year: 2014 Month: januari Month: februari Month: mars Month: april Month: maj Month: juni Month: juli Month: augusti Month: september Month: oktober Month: november Month: december Year: 2015 Month: januari Month: februari Month: mars Month: april Month: maj Month: juni Month: juli Month: augusti Month: september Month: oktober Year: 2016 Month: april Month: maj

Resultat

Du behöver inte skapa någon temporär stdClass, och ska den inte vara temporär så kanske det ändå är att bättre alternativ att använda en array / map eller en typ med ett bättre definierat interface.

Uppdaterade även arraydeklarationerna till [ ... ] istället för den äldre array( ... )-syntaxen. Du kan använda det nyare, kortare formatet sedan 5.4.

Sedan är PHP väldigt förlåtande med att hantera varierande datatyper, och man kan argumentera för att det här inte spelar någon större roll, men i $years1 är månadsnumrena deklarerade som strängar och i $months är de deklarade som heltal, medans motsvarande information i $years återigen är strängar. Det blir lättare att arbeta med koden, och man kan undvika många misstag, om man är konsekvent med typerna.

Abstractions all the way down.