为什么使用 unset() 函数将数组转换为 object?

Why using unset() function cast the array to object?

这是我的代码:

return ApiResponse::Json(200, '', ['categories' => $categories], 200);

这是结果的屏幕截图:

现在,我需要根据特定逻辑取消设置 categories 集合中的项目。所以我写了这个循环:

foreach ($categories as $key => $category) {
    if ($category->BusinessSubCategory->isEmpty())
          unset($categories[0]);
}

return ApiResponse::Json(200, '', ['categories' => $categories], 200);

这是我的新结果:(转换为 object)

嗯..怎么了?取消设置某些项目后如何保留旧结构?

unset() 方法不会改变您的类型。

你的'array'不是数组而是集合。

尝试:

foreach ($categories as $key => $category) {
    if ($category->BusinessSubCategory->isEmpty()) {
        unset($categories[0]);
        break;
    }
}
$categories = array_values($categories->toArray());

return ApiResponse::Json(200, '', ['categories' => $categories], 200);

请注意,如果您要取消设置相同的元素,您应该在执行此操作后中断循环。

试试这个:

foreach ($categories as $key => $category) {
    if ($category->BusinessSubCategory->isEmpty())
          unset($categories[$key]);

}

$categories = array_slice($categories->toArray(), 0, count($categories));

return ApiResponse::Json(200, '', ['categories' => $categories], 200);

看起来你正在使用关系,所以你可以不用循环

$category=Category::with('BusinessSubCategory')
                     ->has('BusinessSubCategory')
                     ->get();

或使用集合

$result= $categories->filter(function ($category){
    
           return  $category->BusinessSubCategory->isNotEmpty();
        });

dd($result->values()->toArray());

如果 $categories 不是集合则使用 collect($categories)->filter...