PHP Laravel如何筛选多维数组指定条件对应的id值
PHP多维数组按嵌套字段筛选提取id实现方案
核心可用函数说明
PHP原生及Laravel框架提供了多个可直接处理数组内部字段的工具函数,不需要手动从零实现遍历判断:
- 原生函数:
array_filter()可按自定义规则过滤数组项,array_column()可批量提取指定键的值,array_reduce()可迭代聚合符合条件的结果 - Laravel扩展:Collection集合类封装的
filter()、where()、pluck()等方法,对多维数组的适配性更好,代码可读性远高于原生循环
推荐实现(Laravel环境)
在Laravel框架下开发,直接用集合处理是最简便的方案,针对你给出的数组结构,代码如下:
// 传入json解码后的数组构造集合 $targetIds = collect($decodedData) ->filter(function ($group) { // 检测当前分组下是否存在type为Blood Donate且status为1的记录 return collect($group) ->where('type', 'Blood Donate') ->where('status', 1) ->count() > 0; }) ->pluck('id') // 提取匹配项的id字段 ->all();
针对你提供的示例数据,执行后返回结果为:
Array ( [0] => 3901ee9e-01bb-483a-9f74-8f7b76290cd5 )
第二个分组下的献血记录status为0,不符合筛选条件,不会被纳入结果。
原生PHP实现(不依赖框架)
如果需要用原生PHP语法实现,可以用双层遍历配合条件判断,逻辑更直观:
$targetIds = []; foreach ($decodedData as $item) { $matched = false; foreach ($item as $key => $record) { // 跳过id字段,只遍历捐赠记录项 if ($key === 'id') continue; if ( is_array($record) && $record['type'] === 'Blood Donate' && (int)$record['status'] === 1 ) { $matched = true; break; } } if ($matched) { $targetIds[] = $item['id']; } }
PHP 7.4及以上版本也可以用array_filter简化写法:
$targetIds = array_column( array_filter($decodedData, function($group) { foreach ($group as $k => $v) { if ($k === 'id') continue; if ($v['type'] === 'Blood Donate' && $v['status'] == 1) return true; } return false; }), 'id' );
提示:如果数组结构可能存在字段缺失的情况,Laravel中可以用
data_get()函数安全读取数组嵌套值,避免出现Undefined array key报错。
内容的提问来源于stack exchange,提问作者Satheesh Kumar
相关产品推荐
相关产品推荐

