如何生成无自身及交叉重复的两数组组合并插入数据库
解决Laravel数组组合插入数据库的交叉重复问题
原代码会将两个相同数组的元素进行全量配对插入,导致出现(a,b)和(b,a)这类交叉重复的记录,同时原代码中return false的逻辑会在第一次遇到元素相等时直接终止程序,这也是不合理的。要实现仅插入单向无重复的组合,可以通过以下两种方式修改:
方式一:基于数组索引控制循环范围(高效推荐)
利用数组索引,让内层循环从外层当前元素的下一个索引开始遍历,这样自然只会生成单向的不重复组合,同时自动跳过元素相等的情况:
$files = ['a','b','c','d','e','f']; foreach($files as $k => $file){ // 从当前索引的下一个元素开始遍历,避免反向配对和重复 for ($i = $k + 1; $i < count($files); $i++) { $value = $files[$i]; $data = [ 'column1' => $file, 'column2' => $value, ]; \DB::table('abed')->insert($data); } }
方式二:基于元素值的比较
如果数组元素是可比较的字符串或数字,可以直接判断元素值的大小,只插入column1值小于column2值的组合:
$files = ['a','b','c','d','e','f']; $other = ['a','b','c','d','e','f']; foreach($files as $file){ foreach($other as $value){ // 仅插入file值小于value值的组合,自动排除重复和反向配对 if($file < $value){ $data = [ 'column1' => $file, 'column2' => $value, ]; \DB::table('abed')->insert($data); } } }
两种方式都能得到你期望的单向无交叉重复的插入结果,其中方式一的循环次数更少,执行效率更高;方式二更灵活,即使数组元素顺序变化也能正常工作。
内容的提问来源于stack exchange,提问作者Vaibhav Harsoda
相关产品推荐
相关产品推荐

