im пытается объединить два массива с отсутствием дублированных значений и вернуть их как JSON с Slim framework. Я выполняю следующий код, но в результате получаю unique
свойство 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,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);