为啥使用 unset() 函数将数组转换为对象?

Posted

技术标签:

【中文标题】为啥使用 unset() 函数将数组转换为对象?【英文标题】:Why using unset() function cast the array to object?为什么使用 unset() 函数将数组转换为对象? 【发布时间】:2021-09-23 09:38:53 【问题描述】:

这是我的代码:

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

这是我的新结果:(被强制转换为对象)

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

【问题讨论】:

不应该是unset($categories[$key]);吗? @AndreaOlivato 没关系..这只是一个样本.. 【参考方案1】:

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

您的“数组”不是数组而是集合。

试试:

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

请注意,如果您要取消设置相同的元素,您应该在这样做之后中断循环。

【讨论】:

array_values(): 参数 #1 ($array) 必须是数组类型,Illuminate\\Database\\Eloquent\\Collection given" 所以你的类型甚至不是一个数组。 嗯,我知道..它是进入循环之前的一个集合,一个对象将在循环之后被输出 我换了帖子,试试这个解决方案。 应该这样写:array_values($categories->toArray());,因为它不是静态的【参考方案2】:

试试这个:

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

【讨论】:

【参考方案3】:

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

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

或使用集合

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

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

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

【讨论】:

以上是关于为啥使用 unset() 函数将数组转换为对象?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MVC 在将对象传递给视图时倾向于将对象转换为数组?

为啥函数的参数对象不是 Javascript 中的数组?

为啥空数组类型转换为零? +[]

使用 ramda 将数组数组转换为数组对象

ThinkPHP如何清空静态数组?

为啥我的 C# 数组在转换为对象时会丢失类型符号信息?