PHP json_encode - 奇怪的行为

时间:2013-08-08 02:31:14

标签: php json behavior

使用json_encode对日期数组进行编码,有时会做一件事,有时做另一件事。

例如,如果我正在尝试编码:

array(6) {
  [0]=>
  string(6) "Jun-24"
  [1]=>
  string(6) "Jun-25"
  [2]=>
  string(6) "Jun-28"
  [3]=>
  string(11) "Training-24"
  [4]=>
  string(6) "Jun-29"
  [5]=>
  string(6) "Jun-30"
}

将输出

["Jun-24","Jun-25","Jun-28","Training-24","Jun-29","Jun-30"]

然而,当我尝试编码类似的东西时:

array(17) {
  [0]=>
  string(6) "Jun-23"
  [1]=>
  string(6) "Jun-24"
  [2]=>
  string(6) "Jun-28"
  [3]=>
  string(11) "Training-24"
  [4]=>
  string(6) "Jun-29"
  [5]=>
  string(6) "Jun-30"
  [6]=>
  string(6) "Jul-06"
  [7]=>
  string(6) "Jul-07"
  [9]=>
  string(6) "Jul-09"
  [10]=>
  string(6) "Jul-16"
  [11]=>
  string(6) "Jul-17"
  [12]=>
  string(6) "Jul-20"
  [13]=>
  string(6) "Jul-23"
  [14]=>
  string(6) "Jul-24"
  [15]=>
  string(6) "Jul-30"
  [16]=>
  string(6) "Aug-01"
  [17]=>
  string(6) "Aug-05"
}

将输出

{"0":"Jun-23","1":"Jun-24","2":"Jun-28","3":"Training-24","4":"Jun-29","5":"Jun-30","6":"Jul-06","7":"Jul-07","9":"Jul-09","10":"Jul-16","11":"Jul-17","12":"Jul-20","13":"Jul-23","14":"Jul-24","15":"Jul-30","16":"Aug-01","17":"Aug-05"}

(抱歉,找不到失败的小例子)

重点是,它为什么这样做?选项是相同的,数组结构相同,问题是什么?

5 个答案:

答案 0 :(得分:7)

您的PHP数组缺少第8项,因此是映射(对象)而不是列表(数组)。

答案 1 :(得分:4)

您的第二个示例中没有设置密钥[8]。根据文档,带有unset键的顺序数组将被编码为JSON对象而不是JSON数组。

答案 2 :(得分:2)

在第一个示例中,数组从零开始按顺序编号。 PHP将其视为传统阵列并对其进行相应编码。

在您的第二个示例中,元素8缺失。 PHP将其视为关联数组并相应地对密钥进行编码。

答案 3 :(得分:0)

由于索引问题, 当您的索引不正确时,它的行为将是这样。

解决的最佳方法是重新编制索引。

$array = array_values($array);

在转换为JSON之前执行此操作。

答案 4 :(得分:0)

仅在对数组进行编码时,请执行以下操作以重新索引数组值:

$encoded = json_encode(array_values($myArray));