作为弱类型语言,PHP对于数字字符串索引是会识别为数字索引的,方便之处在于我们不用太关心类型。示例如下:

$arr = [
    "0"=>123,
    "1"=>456,
    "2"=>789
];
var_dump($arr);
//输出如下:
array(3) {
  [0]=>
  int(123)
  [1]=>
  int(456)
  [2]=>
  int(789)
}

可以看到 不是['0'] 而是 [0]。这会带来什么问题呢?看下面这个例子:(为了展示效果写的)

$array['content_list'] = [];
for ($i=0; $i<2; $i++){
    $array['content_list'][][(string)$i] = "test content";
}
var_dump(json_encode($array));
//输出的结果是:
{
  "content_list": [
    [
      "test content"
    ],
    {
      "1": "test content"
    }
  ]
}

问题很容易就能看出来,期望中的dict类型结果变成了一个list!这是因为php 自动帮我们把数字字符串索引转成数字索引,'0'转换成0,就会识别为从0开始的索引数组。体现在json格式上就是数据类型的变化了。对于客户端如ios等,数据类型出问题,在数据处理上肯定会导致一会故障!当然一般情况下不推荐用这种方式的键,但如果是项目需要呢,问题总归是要解决的。琢磨了一些资料后目前找到一种解决办法,不是很好用,但是确实能解决问题,代码如下:

$arr = new stdClass();
$arr->{'content_list'} = [];
for ($i=0; $i<2; $i++){
    $content = new stdClass();
    $content->{"{$i}"} = "test content";
    $arr->{'content_list'}{$i} = $content;
}
var_dump(json_encode($arr));
// 输出结果
{
  "content_list": [
    {
      "0": "test content"
    },
    {
      "1": "test content"
    }
  ]
}

需要注意的是第一个方式创建的是一个数组,第二种方式创建的是一个对象。那是不是意味着对象类型就可以呢,在尝试用(object)强转之后发现,无效=_=!。如果哪位大哥知道更好的办法,可以给我留个言让我学习下,谢谢!