【问题标题】:axios receives array_filter result as an object instead of arrayaxios 接收 array_filter 结果作为对象而不是数组
【发布时间】:2019-11-19 16:26:17
【问题描述】:

我有一个叫get_product_list的laravel API,它接收一些参数,然后使用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);

}

我在axios中这样调用这个API

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

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

我的代码有什么问题?

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

【问题讨论】:

  • 你能显示你的get_all_products方法的代码吗?
  • 它肯定会返回一个数组! @罗斯威尔逊
  • 哦,好的。凉爽的。我有点想它会返回一个数组,否则array_filter 会抛出一个错误。这不是我问我是否可以看到它的代码的原因。归根结底,除非我知道 $all_products 的确切值是什么,否则我无法尝试复制该问题并最终尝试为您调试它。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 是的,您的答案已完成。我以这种方式解决了问题 $products = []; foreach($all_products as $product){ $products[] = $product; } 重新索引数组,但 array_values() 似乎好多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多