QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

Thinkphp

Thinkphp中的collection用法

 shitouadmin  2026-03-24 09:06:16
什么是 Collection?
在 ThinkPHP 中,当你使用 select() 查询数据库时,默认返回的是一个 think\Collection 对象(在配置文件中可设置)。它看起来像数组,但其实是一个增强型的对象。你可以把它想象成一个“带了各种工具箱的数组”。
如何创建一个 Collection?除了数据库查询自动返回外,你也可以手动转化:
  1. $data = [ 
  2.     ['id' => 1, 'name' => 'Alice''score' => 90], 
  3.     ['id' => 2, 'name' => 'Bob''score' => 80], 
  4. ]; 
  5. $collection = collection($data); // 使用助手函数转化 
常用方法:
1. 字段提取与索引:column如果你只需要提取某一列,或者想把某个字段作为数组的索引(Key):
  1. // 获取所有用户名 
  2. $names = $collection->column('name'); 
  3. // ['Alice', 'Bob'] 
  4.  
  5. // 以 id 为键,name 为值 
  6. $list = $collection->column('name''id'); 
  7. // [1 => 'Alice', 2 => 'Bob'] 

2. 数据过滤:where 与 filter不需要写复杂的 foreach 循环,直接过滤:
  1. // 过滤分数大于 85 的学生 
  2. $highScores = $collection->where('score''>', 85); 
  3.  
  4. // 自定义复杂过滤 
  5. $result = $collection->filter(function($item) { 
  6.     return $item['score'] > 80 && strpos($item['name'], 'A') !== false
  7. }); 

3. 数据转换:each对集合中的每一项进行修改,并返回处理后的集合:
  1. ​$collection->each(function($item, $key) { 
  2.     $item['grade'] = $item['score'] >= 90 ? '优秀' : '良好'
  3.     return $item; 
  4. }); 

4. 排序与切片:order 与 limit在内存中对结果集进行二次处理:
  1. ​$topStudent = $collection->order('score''desc')->limit(1); 

链式调用Collection 的真正魅力在于链式操作。假设你从数据库查出了 100 条用户数据,你需要:过滤掉状态不正常的用户;按照分数倒序排;只取前 10 名;最后只保留他们的姓名和 ID。
  1. ​$result = $users->where('status', 1) 
  2.                ->order('score''desc'
  3.                ->limit(10) 
  4.                ->column('name''id'); 

这段代码的读写效率和可读性,远高于传统的 foreach 和 array_filter。

为什么建议使用 Collection 而不是原生数组?
特性原生数组 (Array)数据集 (Collection)
可读性嵌套多层循环,逻辑琐碎链式调用,语义化强,
功能性需配合 array_ 系列函数自带过滤、排序、分组、统计,
扩展性无法扩展可以自定义 Collection 类增加特殊逻辑
对象转换需要手动处理支持

toArray() 和 toJson()注意事项
内存占用:Collection 是在内存中操作数据的。如果你有几万条数据,建议在 SQL 层面处理(如 WHERE、ORDER BY),而不是全部查出来后用 Collection 处理。
类型转换:虽然 Collection 可以像数组一样 foreach,但如果你调用的第三方函数只接收 array 类型,记得加上 ->toArray()。

总结
ThinkPHP 的 Collection 并非只是简单的数组包装,它代表了一种函数式编程的思想。熟练使用它可以让你的 Controller 代码精简 50% 以上。
¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《Thinkphp中的collection用法》发布于石头博客文章,作者:shitouadmin,如若转载,请注明出处:https://www.pweb123.com/kuangjia/thinkphp/1235.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序