PHP:json编码中的这种差异从何而来?

PHP:json编码中的这种差异从何而来?,php,arrays,Php,Arrays,我有两个数组,在我json\u encode之前,它们在格式上看起来完全相同,但一旦我json\u encode发送回我的ajax调用,这两个数组之间就存在差异,我不知道这是从哪里来的 阵列1: 在json_encode($string)之后: 有效的JSON 阵列2: 在json_encode($secondString)之后 无效的JSON 第二个数组由以下代码行生成: $secondString = array_filter($string, function($value) { retu

我有两个数组,在我
json\u encode
之前,它们在格式上看起来完全相同,但一旦我
json\u encode
发送回我的ajax调用,这两个数组之间就存在差异,我不知道这是从哪里来的

阵列1: 在
json_encode($string)之后

有效的JSON

阵列2: 在
json_encode($secondString)之后

无效的JSON

第二个数组由以下代码行生成:

$secondString = array_filter($string, function($value) { return $value[5] !== null; });
在这里,我通过输出第一个数组中的任何内容来创建一个新数组,其中第5个值不是空的。问题是-有时在执行此筛选后,第二个数组看起来与第一个数组完全相同,而有时它会导致此坏数组

问题:
为什么第二根弦与第一根弦不同,是什么原因导致了这种情况?我看不到这两个数组的格式有任何物理差异,所以我不确定是什么原因导致了这种情况,而且这显然不是json(我假设),因为我的ajax调用在其success函数中没有返回它。

第一个字符串是由
json\u encode(array\u values($array))
返回的值,第二个由
json\u encode($array)
返回

array\u values()
返回具有以
0
开头的数字顺序键的数组
json_encode()
从中生成Javascript数组的表示形式

数组的键不是按顺序排列的。它们是
0
4
54
json_encode()
无法从它们生成Javascript数组。它生成一个Javascript对象以保留键

对于第一个数组,不需要将键存储在
JSON
表示中。它们是从
0
开始的数字顺序,事实上,当元素添加到数组中而不指定它们应该存储的键时,数组在
PHP
Javascript
中都将具有默认键

例如:

// Encode an array having sequential keys starting from 0
$array = array('zero', 1, 'two');
echo(json_encode($array)."\n");
// produces: ["zero",1,"two"] - Javascript array

// Break the sequence
unset($array[1]);
// the keys are now: 0, 2
echo(json_encode($array)."\n");
// produces: {"0":"zero","2":"two"} - Javascript object

// fix the keys sequence
$array = array_values($array);
// the keys are now: 0, 1
echo(json_encode($array)."\n");
// produces: ["zero","two"] - JS array again

// setting a value at any key different than "2" (the next number in the sequence) will break it again
$array['foo'] = 'bar';
echo(json_encode($array)."\n");
// produces: {"0":"zero","1":"two","foo":"bar"} - object

json\u encode()
不会生成无效的json。您的输出中有一个额外的括号。。。不知道这是从哪里来的,但我敢打赌5美元不是来自
json\u encode()
。我更新了我的原始帖子-尽管我仍然不知道这段代码是如何导致这一点的。我敢打赌,你的例子是错误的。您的第一个json编码显示您的数组键是连续的,从0开始,而您的第二个数组有非连续键。@kuroineko-您完全正确,我从第一个字符串中取出了数据(因为它有54个元素长……),但它是连续的。我想在运行新数组之前,我需要使它连续运行
json\u encode
。。。正如海报中提到的,你可以通过
array\u values()
轻松实现。这是一个漂亮的答案,并准确地解释了我做错了什么。现在也有道理了,为什么它有时起作用,而其他的却不起作用。在这种情况下,它恰好工作,可能那些包含数据的键恰好是数组的第一、第二和第三个键,所以它仍然是按顺序排列的。我需要弄清楚如何重新编码一个密钥不正常的数组。非常感谢。我添加了一段代码,使用较小的数组显示行为。哦-我误解了你关于
array\u values
的句子。英语作为第二语言有时很难:)。非常感谢。
Array
(
    [0] => Array
        (
            [0] => White
            [1] => A
            [2] => Ann
            [3] => active
            [4] => Yes
            [5] => 0.0079
            [6] => 0.0100
        )

    [12] => Array
        (
            [0] => Black
            [1] => C
            [2] => Mary
            [3] => active
            [4] => Yes
            [5] => 0.0104
            [6] => 0.0262
        )

    [35] => Array
        (
            [0] => Yellow
            [1] => C
            [2] => Alice
            [3] => active
            [4] => Yes
            [5] => 0.0330
            [6] => 0.0520
        )
)
{"0":["White","A","Ann","active","Yes","0.0079","0.0100"],"12":["Black","C","Mary","active","Yes","0.0104","0.0262"],"35":["Yellow","C","Alice","active","Yes","0.0330","0.0520"]]}
$secondString = array_filter($string, function($value) { return $value[5] !== null; });
// Encode an array having sequential keys starting from 0
$array = array('zero', 1, 'two');
echo(json_encode($array)."\n");
// produces: ["zero",1,"two"] - Javascript array

// Break the sequence
unset($array[1]);
// the keys are now: 0, 2
echo(json_encode($array)."\n");
// produces: {"0":"zero","2":"two"} - Javascript object

// fix the keys sequence
$array = array_values($array);
// the keys are now: 0, 1
echo(json_encode($array)."\n");
// produces: ["zero","two"] - JS array again

// setting a value at any key different than "2" (the next number in the sequence) will break it again
$array['foo'] = 'bar';
echo(json_encode($array)."\n");
// produces: {"0":"zero","1":"two","foo":"bar"} - object