2010-08-24 8 views
9

sind, aber entsprechend: http://www.php.net/manual/en/function.json-encode.php#94157 wird es nicht.Ich möchte json_encode in PHP ein JSON-Array zurückgeben, auch wenn die Indizes nicht in der Reihenfolge

ich flicht bin mit so ich ein Array haben müssen, mit numerischen Indizes zurück, aber was ich bekomme, ist dies:

jsonp1282668482872 ({"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}}); 

so flicht erstickt wird. Wenn ich var_dump das Array, kurz bevor ich nennen json_encode es wie folgt aussieht:

array(7) { 
    [1281830400]=> 
    int(34910) 
    [1281916800]=> 
    int(45385) 
    [1282003200]=> 
    int(56928) 
    [1282089600]=> 
    int(53884) 
    [1282176000]=> 
    int(50262) 
    [1281657600]=> 
    int(45446) 
    [1281744000]=> 
    int(34998) 
} 

irgendwelche Ideen?

+0

Die verwandte Frage ist http://stackoverflow.com/questions/11195692/json-encode-sparse-php-array-as-json-array-not-json-object –

Antwort

7

Es ist konzeptionell unmöglich. Sie können in JSON kein Array mit festen Indizes codieren.

Zur Erinnerung: ein JSON-Array wie folgt aussieht:

[1, 2, 3, 4, 5] 

Es gibt keinen Raum Indizes dort zu setzen.

Sie sollten auf der Javascript Seite arbeiten. Wenn Sie akzeptieren, dass json_encode ein Objekt zurückgibt, können Sie dieses Objekt in ein Array konvertieren. Das sollte nicht zu schwer sein.

function toArray(object) 
{ 
    var result = []; 
    for (var key in object) 
    { 
     if (!key.match(/^[0-9]+$/)) throw new Error("Key must be all numeric"); 
     result[parseInt(key)] = object[key]; 
    } 
    return result; 
} 
+0

Ich denke, es wäre sinnvoller zu beheben das Array auf der PHP-Größe, wenn das OP die Kontrolle über es hat, was es klingt wie sie es tun. Zum einen sollte es geringfügig schneller sein und wird (kaum) weniger Daten an den Client gesendet werden. – pr1001

+0

@ pr1001: Sie werden alle wichtigen Informationen verlieren, wenn Sie dies tun.Da die Schlüssel Zeitstempel sind, glaube ich, dass sie wichtig sind. – zneak

+0

Ich stimme zu, aber wie pkh und ich geschrieben haben, glaube ich, dass er sich auf dem Array-Format irrt, das er in erster Linie braucht. – pr1001

0

Sie array_merge verwenden können, ein numerisch indiziertes Array indizieren, wie folgt aus: indem TRUE als zweiten Parameter

$a = array(2 => 3, 4 => 5); 
$a = array_merge($a); 
var_dump($a); 
+0

Er wird den Schlüssel verlieren, und der Schlüssel scheint wichtig. – zneak

+0

In diesem Fall benötigt er ein JSON-Objekt, ein Array wird dies nicht tun. – Robin

5

Sie können json_decode() zwingen Arrays zu produzieren, aber Sie können nicht zwingen json_encode() Arrays zu erzeugen in erster Linie:

json_decode($json, TRUE); // force array creation 
24

Wie zneak sagt, Javascript (und damit JSON) Arrays können nicht out-of-order-Array Schlüssel haben. So müssen Sie entweder akzeptieren, dass Sie mit JSON-Objekte werde arbeiten, nicht Arrays oder rufen array_values vor json_encode:

json_encode(array_values($data)); 

aber es sieht aus wie Sie suchen Zeitreihendaten mit flicht anzuzeigen. Wie man auf dem flot time series example sehen kann, sollte es sich um ein zwei Elementanordnung wie so sein:

$.plot(
    $('#placeholder'), 
    [[ 
    [1281830400, 34910], 
    [1281916800, 45385], 
    [1282003200, 56928], 
    [1282089600, 53884], 
    [1282176000, 50262], 
    [1281657600, 45446], 
    [1281744000, 34998] 
    ]], 
    { 
    label: 'Hits 2010-08-20', 
    xaxis: {mode: 'time'} 
    } 
) 

Array Given (es uns nennen wir $data) wir die richtige JSON wie so bekommen kann:

json_encode(
    array_map(
    function($key, $value) { return array($key, $value); }, 
    array_keys($data), 
    array_values($data) 
) 
); 
+0

Das ist großartig, ich erreichte das gleiche Ergebnis, indem ich den JSON mit einer Schleife erzeugte, aber ich mag deine Lösung besser. Vielen Dank! –

+0

Froh, zu helfen. Bitte markieren Sie es als Antwort, wenn Sie glauben, dass es Ihre Frage beantwortet. – pr1001

+0

nach 6 Stunden Googeln haben Sie mein Problem gelöst, das richtige JSON in FLOT graphisch darzustellen. DANKE! – newyuppie

0

Für Flot ist das, was du verlangst, nicht das, was du willst. Sie möchten ein Array von Arrays, nicht ein Array von Zahlen. Das heißt, Sie möchten etwas, das wie folgt aussieht:

[[1281830400, 34910], 
    [1281916800, 45385], 
    [1282003200, 56928], 
    [1282089600, 53884], 
    [1282176000, 50262], 
    [1281657600, 45446], 
    [1281744000, 34998]] 

Wie für das in PHP zu tun, bin ich mir nicht sicher.