You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:30:53