将PHP关联数组转换为JSON关联数组

将PHP关联数组转换为JSON关联数组,php,javascript,json,Php,Javascript,Json,我正在使用json_encode将PHP中的查找表转换为JavaScript: AbilitiesLookup Object ( [abilities:private] => Array ( [1] => Ability_MeleeAttack Object ( [abilityid:protected] => [range:protected] => 1

我正在使用json_encode将PHP中的查找表转换为JavaScript:

 AbilitiesLookup Object
(
[abilities:private] => Array
    (
        [1] => Ability_MeleeAttack Object
            (
                [abilityid:protected] => 
                [range:protected] => 1
                [name:protected] => MeleeAttack
                [ability_identifier:protected] => MeleeAttack
                [aoe_row:protected] => 1
                [aoe_col:protected] => 1
                [aoe_shape:protected] => 
                [cooldown:protected] => 0
                [focusCost:protected] => 0
                [possibleFactions:protected] => 2
                [abilityDesc:protected] => Basic Attack
            )
            .....snipped...
在JSON中,它是:

{"1":{"name":"MeleeAttack","fof":"2","range":"1","aoe":[null,"1","1"],"fp":"0","image":"dummy.jpg"},....
问题是我得到的是一个JS对象,而不是数组,标识符是一个数字。我看到了解决这个问题的两种方法——要么找到一种使用数字(我不知道如何)访问JSON的方法,要么使JSON_encode(或其他一些自定义编码函数)能够提供JavaScript关联数组

(是的,我的JavaScript部门比较欠缺)

注意:JSON输出与数组不匹配-这是因为我对下标中的每个元素进行手动JSON编码,然后将其推送到数组(以索引为键),然后对其使用JSON_编码。需要明确的是,数字不是顺序的,因为它是一个关联数组(这就是为什么JSON输出不是数组)

数组('a','b','c')编码为['a','b','c']

转换为object而不是array的原因可能是从1而不是从0索引php数组

我查过了

<?php
echo json_encode(array('a', 'b', 'c'))."\n";
echo json_encode(array(0 => 'a', 'b', 'c'))."\n"; // same as above but explicit
echo json_encode(array(1 => 'a', 'b', 'c'))."\n";

JavaScript对象属性名称可以是任何格式的字符串。它们甚至可以只是数字(就像您的情况一样),使用数字索引/键访问它们也没有问题:

var obj = {
    "1": "foo",
    "2": "bar"
};

obj["1"]; // returns "foo"
obj[1]; // returns "foo" (1 will implicitly get cast to the string "1")

是的,
json\u编码(数组(0=>'a','b','c'))
将给出
[“a”,“b”,“c”]
。也许你应该在回答中明确地提到这一点。JavaScript中的数组总是从零开始使用idex squential。Javascript对象是一个关联数组。javascript中没有其他类型(对象除外)的行为类似于关联数组。我认为这应该被提升并接受,因为它直接解决了Extrakun的问题。“找到一种使用数字(我不知道如何)访问JSON的方法”@Extrakun:我想一个喜欢触发的用户可能已经被
“1”:“foo”
语法惹恼了。。。
var obj = {
    "1": "foo",
    "2": "bar"
};

obj["1"]; // returns "foo"
obj[1]; // returns "foo" (1 will implicitly get cast to the string "1")