Laravel中如何映射结果值到对应键值?解决combine()去重丢失问题
问题:Laravel中combine()处理重复键丢失元素的解决方案
嘿,我来帮你搞定这个问题!你遇到的情况其实是Laravel Collection的combine()方法特性,加上PHP数组的规则导致的——PHP里关联数组的键必须是唯一的。当你用combine()时,第一个集合的元素会作为新集合的键,而你的$customersidurl里有多个null,这些null会被转为空字符串"",重复的键会直接被后面的覆盖,这就是为什么你丢失了3个结果。
而且得先跟你说清楚:你期望的输出里有重复的""键,这在PHP里是做不到的,因为关联数组不允许重复键,就算你硬写,后面的键值对也会把前面的覆盖掉,所以得换个思路来实现“一一对应映射”的需求。
下面给你两个可行的方案:
方案1:生成包含键值对的索引数组(推荐,符合PHP规则)
这个方案能完整保留所有一一对应的关系,把每一组键值对存成一个小数组,放在索引数组里:
// 先把$shortest转成Collection,方便用zip方法配对 $shortestCollection = collect($shortest); // 用zip把两个集合按索引配对,再转成需要的结构 $combined = $customersidurl->zip($shortestCollection)->map(function ($pair) { [$key, $value] = $pair; // 把null转为空字符串,和你想要的一致 return [ 'key' => $key ?? '', 'value' => $value ]; }); // 最终输出的结构是: // [ // ['key' => '', 'value' => 8532.8587780495], // ['key' => '', 'value' => 8532.8587780495], // ['key' => '', 'value' => 8532.8587780495], // ['key' => '31.4346084,74.2793016,12', 'value' => 18.831126689097], // ['key' => '', 'value' => 8532.8587780495], // ['key' => '31.58834,74.37375', 'value' => 0.85071506409078] // ]
如果你习惯用循环的方式,也可以这么写:
$combined = collect(); $customersidurl->each(function ($key, $index) use ($shortest, $combined) { $actualKey = $key ?? ''; $combined->push([ 'key' => $actualKey, 'value' => $shortest[$index] ]); });
方案2:给重复键添加唯一标识(保留关联数组结构)
如果你一定要用关联数组,那得给重复的键加个唯一后缀,保证键不重复:
$keyCounter = []; $combined = collect(); $customersidurl->each(function ($key, $index) use ($shortest, $combined, &$keyCounter) { $actualKey = $key ?? ''; // 统计当前键出现的次数,重复的话加后缀 if (isset($keyCounter[$actualKey])) { $keyCounter[$actualKey]++; $actualKey .= "-{$keyCounter[$actualKey]}"; } else { $keyCounter[$actualKey] = 0; } $combined->put($actualKey, $shortest[$index]); }); // 最终输出的结构是: // [ // "" => 8532.8587780495, // "-1" => 8532.8587780495, // "-2" => 8532.8587780495, // "31.4346084,74.2793016,12" => 18.831126689097, // "-3" => 8532.8587780495, // "31.58834,74.37375" => 0.85071506409078 // ]
内容的提问来源于stack exchange,提问作者Hamza Qureshi
相关产品推荐
相关产品推荐

