axios получает результат array_filter как объект вместо массива - PullRequest
1 голос
/ 10 июля 2019

У меня есть API laravel с именем get_product_list, он получает некоторые параметры и затем использует встроенную функцию php array_filter для фильтрации всех продуктов и возвращает их в конце. Это что-то вроде следующего кода.

public function get_product_list(Request $request)
{
    //validations
    //some code

    $all_products = NULL ;

    //getting all products in an array
    $all_products = $this->get_all_products();

    //applying filters
    $all_products = array_filter($all_products, function($product) use($request){
        $category_flag = true;
        if($request->filled('category_id')){
            $category_flag = ( $request->category_id == $product['main']->category_id);
        }
        return $category_flag;
    });

    return response()->json([
        'status' => TRUE,
        'products' => $all_products
    ],200);

}

Я называю этот API аксиосом вот так

axios.post('/get_product_list', {
               category_id:2,
           })
           .then(function (response) {
                    self.products = response.data.products;
           });

Проблема в том, что когда я не передаю category_id в API, я получаю массив, но когда я передаю его в API, я получаю объект вместо массива.

что не так с моим кодом?

Я не хочу преобразовывать полученный объект в массив в axios, я хочу, чтобы API дал мне массив.

1 Ответ

0 голосов
/ 10 июля 2019

Проблема с array_filter() заключается в том, что он поддерживает ключи.

Например, если у вас есть массив из 5 элементов и отфильтрованы индексы 0 и 2, вы получите

[
  1 => ...,
  3 => ...,
  4 => ...
]

json_encode() создаст объект JSON в этом случае, потому что он не видит плоский массив.

Простое решение состоит в том, чтобы переиндексировать массив с помощью array_values(), например

return response()->json([
    'status' => TRUE,
    'products' => array_values($all_products)
], 200);
...