2011-07-29 6 views
2

私はPHPでJSONオブジェクトを作成し、メインページに戻ってそれを送信します。jsonオブジェクトの内部にある配列の長さを取得する方法は?

$invSlots = array(); 
$invSlots['slots'] = array(); 

for($i = 1; $i < $player_max_slots+1; $i++){ //player max slots comes from db 

     $invSlots['slots'][$i] = $inventory_info3[$i]; 

} 

$json = $invSlots; 
$encoded = json_encode($json); 
die ($encoded); 

をし、POST応答はこれです:そうのようなスロットの量を取得しようとし

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

イム:

var myResponse = JSON.decode('(' + responseText + ')'); //decode server json response 
maxSlots = myResponse.slots.length; //set max slots 

しかし、myResponse.slots.lengthは単に未定義を返します。どうすれば修正できますか?

+2

'slots'が配列ではない、それは別のオブジェクトです。 –

+2

内部的な配列は0から始まりますが、1から始めるように強制しているので、オブジェクトに変わります。あなたは配列の0に戻ってリセットするか、配列に適切な数の「長さ」キーを手動で追加する必要があります。 – Zimzat

答えて

1

slotsは配列ではありません。別のオブジェクトです。

{ "slots": 
    [ 
     { "0": "1" }, 
     { "1": "0" }, 
     { "2": "0" }, 
     ... 
    ] 
} 

あるいは単に:それは配列としてシリアライズされていた場合、それはおそらくより次のようになりZimzatはで言ったように

for ($i = 0; $i < $player_max_slots; $i++) { //player max slots comes from db 
    $invSlots['slots'][$i] = $inventory_info3[$i]; 
} 

{ "slots": [ "1", "0", "0" ] } 

はにあなたのループを変更してみてください上記のコメント、配列のインデックスが0から始まったら、オブジェクトをJSONにシリアル化するときに配列slotを取得する必要があります。

実際には、php.netフォーラムのメンバーによれば、インデックス配列に気づく必要があります。

<?php 
echo json_encode(array("test","test","test")); 
echo json_encode(array(0=>"test",3=>"test",7=>"test")); 
?> 

が得られます:

["test","test","test"] 
{"0":"test","3":"test","7":"test"} 

配列を使用すると、インデックスを定義しない場合、またはあなたのインデックスが連続している場合と0

+0

これは役に立った! – Thaiscorpion

0

で開始あなたが少しを作ることができる唯一の返されます関数:

function len(obj) { 
    var ret = 0; 
    for (var i in obj) ret++; 
    return ret; 
} 

var maxSlots = len(myResponse.slots) 
+1

また、この関数がオブジェクトに添付されたメソッドを取得しないようにするには、 'if(obj.hasOwnProperty(i))'をチェックする必要があります。 – zzzzBov

+0

のポイントはほとんどありません。何らかの操作を実行するための汎用関数を作成する場合、その関数が*動作することを確認する必要があります*。この場合、オブジェクトはJSONから送信されるので、オブジェクトには何の機能もありませんが、オブジェクトが受信された後に関数を追加できる可能性があります。 – zzzzBov

+0

また、誰かがプロトタイプライブラリのようなオブジェクトプロトタイプを変更した場合(これは道路のある時点で含まれる可能性があります)。加えて、「つかの間」を知ることは、言語の背後にある限界や魔法を学ぶための良い方法の1つです。 – Zimzat

1

インデックス配列ではなく、結合配列を宣言しました。だからあなたは長さを使うことはできません。

が連想配列からのカウントを取得するには、そのキーを反復処理する必要があります。

var count=0; 
for (var key in $invSlots['slots']) 
    count++; 
関連する問題