2017-12-13 4 views
1

enter image description herePHPでJSONオブジェクトを作成する必要が

私はので、私はOracleのテーブルからのデータを使用しています、私はd3.jsを使用して積み上げ棒グラフを作成する必要があるとして、以下のようなPHPを使用してJSONオブジェクトを作成したいとJSONを必要としますデータは上記の画像と同じです。
テーブルにはこれらの3つの列があります。 (ID、NAME、レイヤー)のように: -

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

私は、Oracleからデータをフェッチしていたとき、私のPHPコードは次のとおりです。 -

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

私はこのエラーを取得しています: -

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

このデータを画像として提供してください。 – Doggo

+1

画像とスクリーンショットは投稿にはうってつけのものですが、投稿がまだ明確で有用なものでないことを確認してください。 **コードやエラーメッセージの画像を投稿しないでください。** [理由](https://meta.stackoverflow.com/questions/285551/why-not-upload-images-of-code-on-so-質問のとき/ 285557#285557)代わりに実際のデータを直接コピーして貼り付けてください。 –

答えて

1

エラーメッセージは、この例では言及していないフィールドを参照しています。不必要なフィールドを選択しないでください。

これを修正しても、希望するJSON構造が得られません。結果のJSONのdataのすべての要素でオブジェクトとしてlayersを取得するには、エンコードする前にデータベースに格納されている文字列値をPHP配列に変換する必要があります。

あなたは同様のコードでそれを行うことができます:

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

    $streamArr[] = $row; 
} 
+0

すてきな解決策!ブラボー! – Camille

1

@marekful答えは本当に理解することは、良くない最も簡単なものの、効率的かつ短いです!

ここでは、それほど長くて効率的ではありませんが、おそらくもっと簡単です。

$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

おかげさまで、あなたのソリューションは確かに読みやすくなりましたが、かなり長くなりました。あなたはコードで多くのことをするときには短くしたいと思うでしょうし、読みやすくなります。 'explode'は内部的に" foreach "を行いますが、文字列に対してトークナイザを使用し、トークンを繰り返して配列を作成します。この種のPHP関数は、複雑さを隠すのに便利です。 – marekful

関連する問題