axios接收array_filter结果作为对象而不是数组

时间:2019-07-10 05:35:43

标签: php laravel vue.js axios array-filter

我有一个名为get_product_list的laravel API,它接收一些参数,然后使用php内置函数array_filter过滤所有产品并最后返回它们。类似于下面的代码。

my_service:
  privileged: true

我这样在axios中调用此API

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);

}

问题是当我不将category_id传递给API时,我会收到一个数组,但是当我将其传递给API时,我会收到一个对象而不是数组。

我的代码有什么问题?

我不想在axios中将接收到的对象转换为数组,我希望API给我这个数组。

1 个答案:

答案 0 :(得分:0)

array_filter()的问题在于它维护密钥。

例如,如果您有一个包含5个项目的数组并过滤出索引0和2,则最终得到

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

json_encode()在这种情况下将创建JSON 对象,因为它看不到平面数组。

简单的解决方案是使用array_values()重新索引数组,例如

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