2011-07-29 5 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); 

그리고 포스트 응답은 이것이다 :

{"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" }, 
     ... 
    ] 
} 

심지어 단지 :이 배열로 직렬화 된 경우는 아마 같을 것이다

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

Zimzat가에서 말했듯이 :

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

는 당신의 루프를 변경해보세요 위의 주석, 배열의 인덱스가 0에서 시작하면 객체를 JSON으로 serialize 할 때 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

누군가 Prototype 라이브러리 (어떤 점에서 도로에 포함될 수 있음)와 같이 객체 프로토 타입을 수정하는 경우에도 마찬가지입니다. 게다가 '어려움'을 아는 ​​것은 언어의 한계와 '마법'을 배우는 좋은 방법 중 하나입니다. – Zimzat

1

색인 배열이 아니라 연관 배열을 선언했습니다. 따라서 길이를 사용할 수 없습니다.

연관 배열의 수를 얻으려면, 당신은 키를 반복해야합니다

var count=0; 
for (var key in $invSlots['slots']) 
    count++; 
관련 문제