如何基于二维数组内其他行替换每行的sponsor列值
问题解决:替换二维数组中Sponsor的值为对应Record的Email
原代码存在的问题
- 逻辑判断错误:你拿当前元素的
sponsor和自身的record做比较,这和需求中“sponsor对应其他record”的逻辑不符 - 数组构建混乱:每次循环都向
$yes中插入两个元素,导致最终数组结构完全偏离预期 - 未实现核心匹配:没有根据
sponsor的数值去找到对应record项的email值
正确实现方案
思路拆解
- 先构建record与email的映射表:把每个
record作为键,对应的email作为值,这样可以快速通过sponsor的数值找到目标email,避免嵌套循环 - 遍历原数组替换值:基于映射表,把每个元素的
sponsor替换为对应record的email - 容错处理:如果sponsor对应的record不存在,保留原sponsor值避免报错
代码实现
// 原数组 $array = [ ['record' => 1, 'sponsor' => 2, 'email' => 'some@email.com'], ['record' => 2, 'sponsor' => 2, 'email' => 'some1@email.com'], ['record' => 3, 'sponsor' => 2, 'email' => 'some2@email.com'], ['record' => 4, 'sponsor' => 2, 'email' => 'some3@email.com'], ]; // 第一步:构建record => email的映射表 $recordEmailMap = []; foreach ($array as $item) { $recordEmailMap[$item['record']] = $item['email']; } // 第二步:遍历数组替换sponsor值 $processedArray = []; foreach ($array as $item) { $processedItem = $item; // 从映射表取对应email,不存在则保留原sponsor $processedItem['sponsor'] = $recordEmailMap[$item['sponsor']] ?? $item['sponsor']; $processedArray[] = $processedItem; } // 输出结果 print_r($processedArray);
运行结果
输出完全符合预期:
Array ( [0] => Array ( [record] => 1 [sponsor] => some1@email.com [email] => some@email.com ) [1] => Array ( [record] => 2 [sponsor] => some1@email.com [email] => some1@email.com ) [2] => Array ( [record] => 3 [sponsor] => some1@email.com [email] => some2@email.com ) [3] => Array ( [record] => 4 [sponsor] => some1@email.com [email] => some3@email.com ) )
内容的提问来源于stack exchange,提问作者Samuel Asor
相关产品推荐
相关产品推荐

