PHP:为什么array_udiff生成的数组无法转换为有效的json?

时间:2016-06-24 16:51:04

标签: php arrays json

我在PHP中面临一个非常奇怪且不常见的问题。 我正在使用array_udiff作为对象数组。 无法将array_udiff生成的数组转换为有效的JSON格式。

我创建了相同的数组(等于array_udiff生成的数组)然后在JSON中转换了该数组但是这个json结构完全正是我想要的。

我非常详细地写了一个例子来重现这个问题:

<?php
$a = array( (object) array('id'=>1, 'name'=>'abc'), (object) array('id'=>2, 'name'=>'xyz'), (object) array('id'=>6, 'name'=>'Amber'));
$b = array( (object) array('id'=>3, 'name'=>'david'), (object) array('id'=>1, 'name'=>'abc'));

$c = array_udiff($a, $b, 'comp_func');


function comp_func($obj1, $obj2)
{
    return $obj1->id-$obj2->id;
}

echo '<h1>Array Generated by array_udiff:</h1><br> ';

print_r($c);
echo "<br><strong>Invalid JSON:</strong></br>";
echo json_encode($c);
echo "<br><br><br>";
echo '<h1>Manually created array:</h1><br> ';

$d = array( (object) array('id'=>2, 'name'=>'xyz'), (object) array('id'=>6, 'name'=>'Amber'));
print_r($d);
echo "<br><strong>Invalid JSON:</strong></br>";
echo json_encode($d);

输出

enter image description here

所以你可以在上面的例子中看到: print_r打印的两个数组都有类似的结构,但当我尝试用JSON转换它们时,两个数组的JSON结构都不同,如截图所示。

我将感激任何贡献。 感谢

1 个答案:

答案 0 :(得分:7)

array_udiff()中的数组是从索引1开始的,这就是为什么json_encode()无法按照您想要的方式进行编码的原因。您只需更改此行:

$c = array_udiff($a, $b, 'comp_func');

要:

$c = array_values(array_udiff($a, $b, 'comp_func'));

这将从0开始索引数组。