PHP json_encode将数字索引创建为字符串而不是对象

时间:2017-04-11 23:46:35

标签: php json

我在PHP中有以下示例代码:

$data = array(
 'hello',
 'world',
 'hi'
);

$ret = array();
$ret['test'] = array();
$ret['testing'] = array();

foreach($data as $index => $value){
  if($index < 1){
      $ret['test'][$index]['val'] = $value;
      $ret['test'][$index]['me'] = 'index < 1';
  }
  else {
      $ret['testing'][$index]['val'] = $value;
      $ret['testing'][$index]['me'] = 'index >= 1';
  }
}

echo json_encode($ret);

我希望这是JSON输出:

[{
  "test":[
    {
       "val": "hello",
       "me": "index < 1"
    }
  ],
  "testing":[
    {
       "val": "world",
       "me": "index >= 1"   
    },
    {
       "val": "hi",
       "me": "index >= 1"
    }
  ]
}]

然而,最终发生的事情是我最终得到以下结论:

[{
  "test":[
    {
       "val": "hello",
       "me": "index < 1"
    }
  ],
  "testing":{
    "1":{
       "val": "world",
       "me": "index >= 1"   
    },
    "2":{
       "val": "hi",
       "me": "index >= 1"
    }
  }
}]

"1""2"密钥尽管是int,但在使用相同的计数器变量时尽管正确呈现test仍会显示。有没有办法确保testing成为JSON对象数组?

1 个答案:

答案 0 :(得分:2)

因为数组不是以索引0开头,而是以索引1开头,所以它被编码为JSON对象而不是JSON数组。

您可以使用array_values()功能删除索引并仅保留值。

示例:

$ret['testing'] = array_values($ret['testing'])
echo json_encode($ret);

但是因为此时您不需要索引,所以您也可以将代码重构为:

foreach($data as $index => $value){
  if($index < 1){
    $ret['test'][] = array(
      'val' => $value,
      'me' => 'index < 1'
    );
  }
  else {
    $ret['testing'][] = array(
      'val' => $value,
      'me' => 'index >= 1'
    );
  }
}
echo json_encode($ret);

这样,数组将始终以索引0开头。