2011-11-13 8 views
0

私はjson_encodeされたPHPスクリプトから受け取ったデータを使用しようとしていますが、それは正しくできないようです。PHPからJSONデータを解釈するのに苦労しています

これは私が JSを使用していますJavaScript関数です:

function dispJSON(items) { 
    console.log('Raw from PHP:' + items); 
    var strJSON = JSON.stringify(items); 
    console.log('Sent from PHP and stringified:' + strJSON); 
    $('#results').append(strJSON + '<hr>'); 
    var opStr = ''; 
    for (i=0; i<items.length; i++){ //Get each Record 
    console.log('REC=' + items[i].tostring); 
    for (var key in items[i]) { 
     console.log(key + ' => ' + items[i][key]); 
    } 
    } 
} 

、これは、コンソールが言うことです。 コンソール:

WCIT.html:60 Sent from PHP and stringified:[[{"vehGrpName":"Austin","vehTitle":"Austin A30 (AS3 and AS4)","vehDescrip":"The new look Baby Austin to rival the Morris Minor."}],[{"vehGrpName":"Austin","vehTitle":"Austin A35","vehDescrip":"An improved A30. Better brakes, gearbox and engine."}]] 
WCIT.html:64 REC=undefined 
WCIT.html:66 0 => [object Object] 
WCIT.html:64 REC=undefined 
WCIT.html:66 0 => [object Object] 

は、だから私はいくつかの基本を明らかに誤解しています。私のjavascript/jsonの知識は非常に限られています。

私は私のコードは明らかにゴミなので、誰でもできれば2つの配列の最大(すなわち、レコードのJSONオブジェクトが含まれている各レコード、)

をした、一つのアレイ(すべてのレコード)を取得しているように見えます私を右に置いて、私は最も感謝します。

おかげで、あなたのdispJSON機能で

+0

あなたが ''項目[I] .toStringを()もしかして? –

答えて

1

は、あなたは、もはやすべて  —で(テキストデータ表記である)JSONを扱っていないしているどこかのラインに沿って何かを(便利です)あなたのためにそれを直列化復元しています。結果の配列を扱っています。文字列化されたコピーの外観から、それが配列の配列の、及び(奇妙な唯一のエントリをそれぞれ有する)サブアレイ内の各エントリは、様々な特性を持つオブジェクトである:

[ 
    [ 
     { 
      "vehGrpName": "Austin", 
      "vehTitle": "Austin A30 (AS3 and AS4)", 
      "vehDescrip": "The new look Baby Austin to rival the Morris Minor." 
     } 
    ], 
    [ 
     { 
      "vehGrpName": "Austin", 
      "vehTitle": "Austin A35", 
      "vehDescrip": "An improved A30. Better brakes, gearbox and engine." 
     } 
    ] 
] 

jsonlintはのために便利ですプリティプリント構造)

だからあなたはそれをループにしたいとサブアレイとそのエントリのそれぞれに対処します(live copy):。

function dispStuff(items) { 
    var outer, inner, sub, entry; 

    for (outer = 0; outer < items.length; ++outer) { 
     sub = items[outer]; 
     for (inner = 0; inner < sub.length; ++inner) { 
      entry = sub[inner]; 
      console.log("Entry " + outer + "," + inner + ":"); 
      console.log("vehGrpName = " + entry.vehGrpName); 
      console.log("vehTitle = " + entry.vehTitle); 
      console.log("vehDescrip = " + entry.vehDescrip); 
     } 
    } 
} 

それとも、したくない場合あなたのコードにエントリキーを持っています(live copy):

function dispStuff(items) { 
    var outer, inner, sub, entry, name; 

    for (outer = 0; outer < items.length; ++outer) { 
     sub = items[outer]; 
     for (inner = 0; inner < sub.length; ++inner) { 
      entry = sub[inner]; 
      console.log("Entry " + outer + "," + inner + ":"); 
      for (name in entry) { 
       console.log(name + " = " + entry[name]); 
      } 
     } 
    } 
} 

for..inオブジェクトのプロパティの名前をループ(だけでなく、そのプロトタイプオブジェクトのいずれかのプロパティ名ので動作します)、そして次の2つのオブジェクトプロパティを参照することができますので、さまざまな方法があります。おなじみのobj.propNameフォームでは、propNameはリテラル、obj["propName"]フォームではプロパティ名が文字列です。もちろん、それは文字列なので、任意の式の結果である可能性があります。

別に

:あなたはあなたのPHPコードが一つのエントリごとにサブアレイを作成している理由を知りたいかもしれません...

+0

多くのお手伝いに感謝します。私たちがPHP側に行く前に。実際の例では、vehGrpTitleとvehGrpDescripは「未定義」を返していますが、文字列として存在しています。また、私のコードでキー値を参照する必要もありませんでした。レコードのArray [0 etc]、最初のレコードの2番目のフィールドのArray [0] [1]など、インデックス値を使用してキー値を参照することはできません。再度、感謝します。 – mcl

+0

私は、フィールド名vehGrpTitleとvehGrpDescripがGrpを持っていないという混乱を引き起こしたと思います。彼らはvehTitleとvehDescrip - apologiesでなければなりませんPHPは次のよ​​うになります: '\t $ select =" SELECT vehGrpName、vehTitle、vehDescrip FROM vehicles LIMIT 20 "; \t $ result = mysql_query($ select)またはdie(mysql_error()); //クエリ \t $ recs = array(); \t(はmysql_num_rows($結果)){ \t \tながら($ポスト= mysql_fetch_assoc($結果)){ \t \t $ RECS [] =配列($ポスト)であれば、 \t \t} \t} \t // 3)、JSON \tヘッダ( 'コンテンツタイプ:アプリケーション/ JSON' としてエコー結果)。 \t echo json_encode($ recs); ' – mcl

+0

@mcl:申し訳ありませんが、この例では誤字がありました(「vehTitle」ではなく「vehGrpTitle」などの説明に似ています)。確かに、あなたのコードは事前にそれらを知っているのではなく、プロパティ名をループすることができます。 –

関連する問題