如何在PHP多维数组中查找每个extraid值对应的首个匹配元素
原有代码的问题
- 判断逻辑错误:
array_search匹配到第一个符合条件的元素时会返回下标0,直接用if($key)判断会把0识别为布尔假,漏掉extraid对应的第一个元素 - 语法错误:
$userarray内的元素是数组类型,不能用对象操作符->访问属性,应该用数组赋值语法$userarray[$key]['category_name'] - 性能问题:每次循环都调用
array_column重新生成extraid列,数据量大的时候会有不必要的性能损耗
正确实现代码
// 第一步:提取每个extraid对应的第一个子数组,用extraid作为键方便后续关联 $firstItemByExtraid = []; foreach ($userarray as $item) { $extraid = $item['extraid']; // 只有该extraid还没存过的时候才写入,保证保留第一个出现的元素 if (!isset($firstItemByExtraid[$extraid])) { $firstItemByExtraid[$extraid] = $item; } } // 第二步:关联分类名称 $all_category = $this->common->getAll(TABLE_CONF_CATEGORIES, 'year', $year); foreach ($all_category as $cats) { $catId = $cats->id; // 直接用isset判断,比array_search效率高很多 if (isset($firstItemByExtraid[$catId])) { $firstItemByExtraid[$catId]['category_name'] = $cats->category_name; } } // 如果需要重置为普通索引数组格式,可执行下面的代码 $firstItemByExtraid = array_values($firstItemByExtraid);
实现逻辑说明
- 遍历原数组时用extraid作为临时数组的键,遇到不存在的键才写入,天然保证每个extraid只保留第一个出现的子数组
- 关联分类时直接通过键判断存在性,时间复杂度为O(1),比原有每次循环调用array_search+array_column的O(n)效率高很多
- 修正了原有判断逻辑和数组访问的语法错误
内容的提问来源于stack exchange,提问作者tacqiya
相关产品推荐
相关产品推荐

