PHP中array_filter筛选嵌套关联数组仅首项生效,前端无法展示其余匹配结果
问题原因
你遇到的是PHP array_filter 函数的经典特性导致的前端兼容问题:
array_filter会保留原数组的键名,你给出的示例数组两条数据的原始键分别是0和1- 当你搜索"Jewe"时,过滤结果保留了键
0,转JSON时会被识别为标准索引数组,前端可以正常遍历 - 当你搜索"Mar"时,过滤结果只保留了键
1,PHP转JSON时会识别为关联数组,输出为{"1": {"customers_id":321, ...}}格式的对象,前端如果按照数组逻辑遍历(比如从索引0开始循环)就会无法读取到数据
- 当你搜索"Jewe"时,过滤结果保留了键
- 你var_dump能看到正确数据是因为PHP侧打印不关心数组键是否连续,只有序列化传递给前端时才会出现格式差异
修复方案
1. 先修正代码中潜在的错误
你当前代码有两处容易引发问题的写法:
- 使用
ARRAY_FILTER_USE_BOTH时,回调函数的参数顺序是(值, 键),你当前的参数名写反了,虽然运行暂时没问题但容易后续出错 - 你数组中存储客户名称的键是
customers_name,但匹配逻辑里写的是customers_company,请确认实际字段名是否一致
2. 核心修复:重置数组索引
在array_filter执行完成后,用array_values重置数组的键为从0开始的连续索引即可,修改后代码如下:
if($request->param('company_name')) { $input = "/".$request->param('company_name')."/"; $users = array_filter($my_users, function($user, $index) use ($input) { // 确认此处字段名和数组内的键一致 return preg_match($input, $user['customers_name']); }, ARRAY_FILTER_USE_BOTH); // 新增这行重置数组索引 $users = array_values($users); }
3. 其他逻辑适配
你提到的按customers_id搜索的逻辑也存在同样的问题,同样在array_filter后执行array_values即可修复。
内容的提问来源于stack exchange,提问作者Pis7ftw
相关产品推荐
相关产品推荐

