我试图合并两个数组,省略重复的值,并使用Slim框架将其作为
JSON返回.我做了以下代码,但结果我得到了JSON的唯一属性作为对象 – 而不是数组.我不知道为什么会这样,我想避免它.我该怎么做?
我的代码:
- $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
- }
似乎array_unique返回了一些奇怪的东西,但是原因是什么?
array_unique从数组中删除重复的值,但保留了数组键.
所以像这样的数组:
- array(1,2,3)
将被过滤为此
- array(1,3)
但值“3”将保持其键为“3”,因此得到的数组确实是
- array(0 => 1,1 => 2,3 => 3)
并且json_encode无法将这些值编码为JSON数组,因为没有空洞时键不是从零开始.能够恢复该数组的唯一通用方法是为其使用JSON对象.
如果要始终发出JSON数组,则必须对数组键重新编号.一种方法是将数组与空数组合:
- $nonunique = array(1,3);
- $unique = array_unique($nonunique);
- $renumbered = array_merge($unique,array());
- json_encode($renumbered);
另一种方法是让array_values为你创建一个新的连续索引数组:
- $nonunique = array(1,3);
- $renumbered = array_values(array_unique($nonunique));
- json_encode($renumbered);