Laravel 集合将数组转换为对象

Posted

技术标签:

【中文标题】Laravel 集合将数组转换为对象【英文标题】:Laravel collection converts array to object 【发布时间】:2017-06-30 04:34:55 【问题描述】:

如果我运行$collection->filter(myFilter),Laravel 会像这样为集合中的每个模型添加键,这很烦人:


    "4": 
        "myObject": "data"
    ,
    "7": 
        "myObject": "data"
    

如何去掉“4”和“7”,让它成为我的对象数组?

我运行的代码是:

$obj = Cars::with('brand')->orderBy('id')->get();

return $obj->filter(function($value, $key)

    return $value->display == true;
);

【问题讨论】:

我觉得flatten() 可能会满足您的需求,但您需要提供更多示例代码来查看如何获得此输出。 是的,flatten() 应该可以解决问题 @Dwight 添加了代码 - 展平工作。随意添加一个答案让我接受。 @tgun926 虽然flatten() 恰好在这种情况下有效,但values() 是合适的使用方法。我添加了一个带有解释的答案。 【参考方案1】:

问题在于filter() 方法不会重新设置底层集合数组的密钥。所以,Collection 仍然代表一个数组,只是你的数组看起来像这样:

[
    4 => Object4,
    7 => Object7,
]

虽然这在 php 中是一个完全有效的数组,但在 JSON 中这不是一个正确的数组。由于这在 JSON 中无法表示为数组,因此将其转换为 JSON 中的对象。

为了在 JSON 中正确地表示为数组,您只需重新设置 Collection 数组的键。正确的方法是values() 方法。它所做的只是在底层数组上调用array_values。这将把上面的数组变成这样:

[
    0 => Object4,
    1 => Object7,
]

现在,这是一个正确的数字索引数组,JSON 可以理解并将其视为数组而不是对象。

虽然flatten 可能适用于这种特殊情况(您的集合是 Eloquent 模型的集合),但它实际上不是正确的方法,并且可能会导致意想不到的后果。此外,它将执行许多不需要的额外逻辑。您最好的选择是使用正确的方法来实现您想要实现的目标,这就是 values() 方法。

$obj = Cars::with('brand')->orderBy('id')->get();

return $obj->filter(function($value, $key)
    
        return $value->display == true;
    )
    ->values();

【讨论】:

啊,是的,@patricus 是对的 - values 是在这里使用的正确方法,并且如前所述,它应该更高效。完全忘记了那个方法,很高兴被提醒。这应该是公认的答案。 @patricus也许你可以帮助我。看看这个:***.com/questions/51488623/…【参考方案2】:

在您的集合上调用 flatten() 应该删除键并将它们的所有值合并到一个集合中。

【讨论】:

以上是关于Laravel 集合将数组转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

laravel怎么把对象转换为数组

将 Laravel 集合/数组转换为 Javascript 数组

如何将 Laravel 集合数组转换为 json

Laravel:将 Eloquent 集合转换为数组而不转换元素

Laravel - 将数组转换为雄辩的集合

如何将二维数组转换为集合 laravel?