遍历数组集合并返回命名键值对(Laravel/Eloquent)

Posted

技术标签:

【中文标题】遍历数组集合并返回命名键值对(Laravel/Eloquent)【英文标题】:Loop through a collection of Arrays and return named key value pairs (Laravel/Eloquent) 【发布时间】:2021-07-17 05:44:12 【问题描述】:

我正在使用 Laravel,目前我有一个雄辩的 Collection 被返回,其中包含 3 个数组。每个数组中都有嵌套的模型集合。

结构是这样的:

Illuminate\Database\Eloquent\Collection #1905 ▼
  #items: array:3 [▼
    0 => app\Models\User #1804 ▶
    1 => app\Models\User #1805 ▶
    2 => app\Models\User #1806 ▶
  ]

每个用户展开后都是这样

#attributes: array:3 [▼
        "user_id" => 12345
        "first_name" => "John"
        "last_name" => "Doe"]

我想要返回的是一个数组,其中包含所有用户的 user_id => 12345

我尝试了传统的foreach,但索引一直以0 => 12345 而不是user_id 作为我的键返回。我还尝试使用pluck() 提取user_id,但我得到了与数字key 相同的结果。

有没有使用 eloquent 实现这一目标的有效方法?

【问题讨论】:

使用pluck('user_id')->values() @KamleshPaul 如果我在我的集​​合上使用pluck('user_id')->values() 然后添加toArray() 它会返回一个数组但带有数字键。 array:2 [▼ 0 => 12345 1 => 12346 ] 但我希望 0,1 成为 user_id 【参考方案1】:

Pluck 不起作用,因为 user_id 是您正在提取的集合中的值。

为什么不只使用您想要的字段进行选择...而不是从集合中删除您不需要的东西?

例如,这将返回一个数组数组,其中键 id 和值是该 id。

User::select('id')->get()->toArray();
 [
     [
       "id" => 1,
     ],
     [
       "id" => 2,
     ],
]

但要根据您拥有的数据做您想做的事,您可以使用map 并仅返回您需要的键值数据。这是一个简短的例子:

$collection = [
  [
    "user_id" => 12345,
    "first_name" => "John",
    "last_name" => "Doe",
  ],
  [
    "user_id" => 12346,
    "first_name" => "John 2",
    "last_name" => "Doe",
  ],
  [
    "user_id" => 12347,
    "first_name" => "John 3",
    "last_name" => "Doe",
  ],
];

collect($collection)->map(function ($user) 
  return [
    "user_id" => $user["user_id"],
  ];
);

从一个起始数组记住这种方式,所以在你的情况下,我假设你这样做:

User::get()->map(function ($user) 
  return [
    'user_id' => $user->user_id,
  ];
);

【讨论】:

以上是关于遍历数组集合并返回命名键值对(Laravel/Eloquent)的主要内容,如果未能解决你的问题,请参考以下文章

将一个字典内的内value转换为集合:返回一个数组,此数组中包含输入字典的键值对中的数组的所有元素(为NSArray添加category)

如何遍历对象数组并制作键值对?

Set 数组去重

PHP遍历键值对数组

map集合中的键值对对象遍历

排序数组以及遍历普通对象的键值对以及如何遍历一个不同键值的对象数组