2017-12-13 7 views
1

enter image description hereNeed JSON-Objekt in PHP

Ich mag erstellen ein JSON-Objekt mit PHP wie unten als ich brauche erstellen ein gestapeltes Balkendiagramm d3.js verwenden, damit ich unter Verwendung von Daten aus Oracle-Tabelle und muß die json erstellen Daten wie oben gezeigt.
Meine Tabelle hat diese 3 Spalten. (ID, Name, Schichten) wie: -

ID, NAME, Layers 
1 ABC a:8,b:10 
2 WWW c:8,d:7 

Wenn ich Daten am Abrufen von Oracle, mein PHP-Code ist: -

while (($row = oci_fetch_array($stid, OCI_ASSOC))) { 
      $streamArr[] = $row; 
}  
header("Access-Control-Allow-Origin: *"); 
echo json_encode($streamArr); 

Ich erhalte diese Störung: -

Warning: [json] (php_json_encode) type is unsupported, encoded as null in line 48 
json output as:- 
[["1","ABC",{"descriptor":null}],["2","WWW",{"descriptor":null}]] 
can you please help me in rectifying with this issue? 
+0

Könnten Sie bitte diese Daten nicht als Bild zur Verfügung stellen. – Doggo

+1

Bilder und Screenshots können eine nette Ergänzung zu einem Beitrag sein, aber stellen Sie bitte sicher, dass der Beitrag immer noch klar und nützlich ohne sie ist. ** Veröffentlichen Sie keine Bilder von Code oder Fehlermeldungen. ** Lesen Sie [warum] (https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so- when-asking-a-question/285557 # 285557) Kopieren Sie stattdessen die tatsächlichen Daten und fügen Sie sie direkt in den Post ein. –

Antwort

1

Die Fehlermeldung bezieht sich auf ein Feld, das Sie im Beispiel nicht erwähnt haben. Vielleicht wählen Sie einfach nicht benötigte Felder nicht aus.

Wenn Sie das beheben, erhalten Sie immer noch nicht die gewünschte JSON-Struktur. Um layers als Objekt in jedem Element von data im resultierenden JSON zu erhalten, müssen Sie die in der Datenbank gespeicherten String-Werte vor der Codierung in PHP-Arrays konvertieren.

Sie, dass mit ähnlichen Code tun könnte:

while (($row = oci_fetch_array($stid, OCI_ASSOC))) 
{ 
    $row['layers'] = array_map(function($el) { 
    return explode(':', $el); 
    }, explode(',', $row['layers'])); 

    $streamArr[] = $row; 
} 
+0

Schöne Lösung! Bravo! – Camille

1

@marekful Antwort ist wirklich schön, zu verstehen, aber effizient und kurz nicht am einfachsten!

Hier haben Sie eine längere und nicht so effizient, aber vielleicht einfacher zu bekommen.

$streamArr = array(); 
while (($row = oci_fetch_array($stid, OCI_ASSOC))) 
{ 
    // Get ID and NAME 
    $data = array(
     'id' => $row['ID'], 
     'name' => $row['NAME'], 
     'layers' => array() 
    ); 
    // Get Layers by split by comma 
    $layers = explode(',', $row['layers']); 
    foreach ($layers as $layer) { 
     // Get layer parts by slit with double-point 
     $layersPart = explode(':', $layer); 
     foreach ($layersPart as $key => $value) { 
      $data['layers'][$key] = $value; 
     } 
    } 
    // Add to global array 
    $streamArr[] = $data; 
} 
echo json_encode($streamArr); 
+1

Danke Camille, deine Lösung ist zwar besser lesbar, aber etwas länger. Sie werden kurz sein, wenn Sie viel mit Code arbeiten, und es wird auch einfacher zu lesen. 'explode' macht zwar intern zwar" foreach ", verwendet jedoch einen Tokenizer für die Zeichenfolge und iteriert über die Token, um ein Array zu erstellen. Diese Art von PHP-Funktionen sind praktisch, um die Komplexität zu verbergen. – marekful