array_unique函数之后的数组作为JSON响应中的对象返回

时间:2014-08-13 21:40:56

标签: php slim

我试图合并两个数组,省略重复值,并将其作为带有Slim框架的JSON返回。我做了以下代码,但结果我得到了JSON的unique属性作为对象 - 而不是数组。我不知道为什么会这样,我想避免它。我该怎么办?

我的代码:

$galleries = array_map(function($element){return $element->path;}, $galleries);
$folders = array_filter(glob('../galleries/*'), 'is_dir');

function transformElems($elem){
    return substr($elem,3);
}           
$folders = array_map("transformElems", $folders);

$merged = array_merge($galleries,$folders);
$unique = array_unique($merged); 

$response = array(
  'folders' => $dirs, 
  'galleries' => $galleries, 
  'merged' => $merged, 
  'unique' => $unique);
echo json_encode($response);

作为JSON回复,我得到:

{
folders: [] //array
galleries: [] //array
merged: [] //array
unique: {} //object but should be an array
}

http://i.imgur.com/cfHy8Od.png

似乎array_unique返回了一些奇怪的东西,但原因是什么?

1 个答案:

答案 0 :(得分:22)

array_unique从数组中删除重复的值,但保留数组键。

所以像这样的数组:

array(1,2,2,3)

将被过滤为此

array(1,2,3)

但价值" 3"将保留" 3"的密钥,因此生成的数组确实是

array(0 => 1, 1 => 2, 3 => 3)

并且json_encode无法将这些值编码为JSON数组,因为没有空洞时键不是从零开始。能够恢复该数组的唯一通用方法是使用JSON对象。

如果要始终发出JSON数组,则必须重新编号数组键。一种方法是将数组与空数组合:

$nonunique = array(1,2,2,3);
$unique = array_unique($nonunique);
$renumbered = array_merge($unique, array());

json_encode($renumbered);

另一种实现方法是让array_values为你创建一个新的连续索引数组:

$nonunique = array(1,2,2,3);
$renumbered = array_values(array_unique($nonunique));

json_encode($renumbered);