Thorsten: Spielzeug ...

Beitrag lesen

<?php

# Simulation Datenbank:
$ar[1]=1;
$ar[2]=2;
$ar[3]=2;
$ar[4]=1;
$ar[5]=9;
#$ar[6]=0;
$ar[7]=3;
#$ar[8]=0;
#$ar[9]=0;
$ar[10]=4;
$ar[11]=3;
#$ar[12]=0;

$a[2015]=$ar;

$Jahr_min = 2015;
$Jahr_max = 2015;

# Auffüllen der Monate

for ( $Jahr=$Jahr_min; $Jahr<=$Jahr_max;$Jahr++ ) {
    #für jeden Monat:
    for ($Monat=1; $Monat <= 12; $Monat++) {
        if ( empty( $ar[$Monat])) { $ar[$Monat] = 0; }
        $a[$Jahr][$Monat-1]=$ar[$Monat];
    }
}

#Erzeugen des JSON-Strings:
echo json_encode($a, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
echo "\n";


#Erzeugen des JSON-Strings - manuell:
$Jahr=2015;
#für jeden Monat:
$s = "{\n\"" . $Jahr . '":[';

for ($Monat=0; $Monat < 12; $Monat++) {
    $s .= $a[$Jahr][$Monat];
    if ( 11 != $Monat ) {
        $s .= ',';
    }
}
$s .= "]\n}";
echo $s;
echo "\n";

Man kann sich, wie Cheatah vor Jahren hier schon einmal anmerkte, auf die Reihenfolge der Elemente eines Arrays nicht wirklich verlassen. (Auf die Indizes aber schon...) Der mit json_encode erzeugte String sieht zwar optisch nicht so aus wie Dein JSON:

{
    "2015": {
        "1": 1,
        "2": 2,
        "3": 2,
        "4": 1,
        "5": 9,
        "7": 3,
        "10": 4,
        "11": 3,
        "6": 0,
        "8": 0,
        "9": 0,
        "12": 0
    }
}

hat aber praktisch den gleichen Inhalt. Ansonsten kann man manuell einen String basteln...

{
"2015":[1,2,2,1,9,0,3,0,0,4,3,0]
}

Hallo Jörg,

erstmal dankeschön für Deine "Spielerei". Ich antworte hier in diesem Post, auch wenn ich damit Deine Arrayanfangskorrektur mal außen vor lasse, damit ich den Quelltext zitieren kann.

Ich frage mich gerade, warum Du da so kompliziert heran gehst?

$jahrmin und -max benötigen wir eigentlich nicht, da bereits durch die Query vorgegeben. Ich stimme mit Dir und Cheatah überein, dass die Indizes verlässlich sind und wir sie auch nutzen sollten. Das Array (nicht das gebastelte, sondern das erste) wird von meiner JS-Anwendung nicht akzeptiert. Ist zwar gültiges JSON, aber die Anwendung will explizit nur mit der vorgegebenen Notierung arbeiten. Du brauchst den String aber gar nicht manuell zu basteln, das geht auch mittels Schleife.

Ich habs mal hier ähnlich Deiner Vorgehensweise angepasst.

# Simulation Datenbank:
$arr[0]=130;
#$arr[1]=0;
$arr[2]=50;
#$arr[3]=0;
$arr[4]=160;
$arr[5]=150;
$arr[6]=130;
$arr[7]=120;
#$arr[8]=0;
$arr[9]=40;
$arr[10]=160;
$arr[11]=350;

$jahr = 2015;

for ($Monat=0; $Monat <= 11; $Monat++) {
if (empty($arr[$Monat])) {
	$innenarray[$Monat] = 0;
} else {
  	$innenarray[$Monat] = $arr[$Monat];
}
}

$data = array($jahr => $innenarray);
echo json_encode($data);

ergibt:

{"2015":[130,0,50,0,160,150,130,120,0,40,160,350]}

Oder habe ich was übersehen oder nicht bedacht?

Thorsten