Laravel集合将数组转换为对象

tgu*_*926 5 php json laravel laravel-collection

如果我运行$collection->filter(myFilter),Laravel会为集合中的每个模型添加密钥这样烦人的事情,如下所示:

{
    "4": {
        "myObject": "data"
    },
    "7": {
        "myObject": "data"
    }
}
Run Code Online (Sandbox Code Playgroud)

如何摆脱"4"和"7",这是我的对象数组?

我运行的代码是:

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

return $obj->filter(function($value, $key)
{
    return $value->display == true;
});
Run Code Online (Sandbox Code Playgroud)

pat*_*cus 21

问题是该filter()方法不会重新生成基础集合数组.所以,Collection仍然代表一个数组,只是你的数组看起来像这样:

[
    4 => Object4,
    7 => Object7,
]
Run Code Online (Sandbox Code Playgroud)

虽然这是PHP中完全有效的数组,但这不是JSON中的正确数组.由于这不能在JSON中表示为数组,因此它将转换为JSON中的对象.

为了在JSON中将其正确表示为数组,您只需要重新生成Collection数组.适当的方法是这种values()方法.它只是调用array_values底层数组.这将转换上面的数组:

[
    0 => Object4,
    1 => Object7,
]
Run Code Online (Sandbox Code Playgroud)

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

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

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

return $obj->filter(function($value, $key)
    {
        return $value->display == true;
    })
    ->values();
Run Code Online (Sandbox Code Playgroud)

  • 是啊,@ patricus是对的 - "值"是在这里使用的正确方法,如上所述它应该更高效.完全忘了这个方法,好提醒.这应该是公认的答案. (3认同)

Dwi*_*ght 5

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