PHP数组内容不重复组合排列算法

最近在做ecshop的商品库存模块,分别给一款商品的多个属性组合设置库存,如下图:

一款手机有不同颜色,屏幕尺寸,系统和电量,都要设置不同的库存,如果都要手动选择属性组合,则会耗费很多不必要的时间。假如打开页面时就已经设置好属性排列组合那就最好不过,因此想了整天,写了如下函数:

 1 <?php
 2
 3 /*
 4 Author:GaZeon
 5 Date:2016-6-20
 6 Function:getArrSet
 7 Param:$arrs 二维数组
 8 getArrSet(array(array(),...))
 9 数组内容不重复组合排列
10 */
11 function getArrSet($arrs,$_current_index=-1)
12 {
13     //总数组
14     static $_total_arr=array();
15     //总数组下标计数
16     static $_total_arr_index=0;
17     //输入的数组长度
18     static $_total_count;
19     //临时拼凑数组
20     static $_temp_arr=array();
21
22     //进入输入数组的第一层,并初始化输入数组长度
23     if($_current_index<0)
24     {
25         $_total_count=count($arrs)-1;
26         getSet($arrs,0);
27     }
28     else
29     {
30         //循环第$_current_index层数组
31         foreach($arrs[$_current_index] as $v)
32         {
33             //如果当前的循环的数组少于输入数组长度
34             if($_current_index<$_total_count)
35             {
36                 //将当前数组循环出的值放入临时数组
37                 $_temp_arr[$_current_index]=$v;
38                 //继续循环下一个数组
39                 getSet($arrs,$_current_index+1);
40
41             }
42             //如果当前的循环的数组等于输入数组长度(这个数组就是最后的数组)
43             else if($_current_index==$_total_count)
44             {
45                 //将当前数组循环出的值放入临时数组
46                 $_temp_arr[$_current_index]=$v;
47                 //将临时数组加入总数组
48                 $_total_arr[$_total_arr_index]=$_temp_arr;
49                 //总数组下标计数+1
50                 $_total_arr_index++;
51             }
52
53         }
54     }
55
56     return $_total_arr;
57 }
58
59 /*************TEST**************/
60 $arr=array(
61     array(‘a‘,‘b‘,‘c‘),
62     array(‘A‘,‘B‘,‘C‘),
63     array(‘1‘,‘2‘,‘3‘),
64     array(‘I‘,‘II‘,‘III‘)
65 );
66
67 var_dump(getArrSet($arr));
68     
时间: 2024-11-08 01:44:56

PHP数组内容不重复组合排列算法的相关文章

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[['白色','16G','移动'], ['白色','16G','联通'] ...]这样的组合,扩张,如果后面还有参数,比如再加一个['国行','港版','美版'],不改程序一样可以执行! 通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合 算法代码写法一: // 执行组合排列的函数

【LeetCode-面试算法经典-Java实现】【026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)】

[026-Remove Duplicates from Sorted Array(删除排序数组中的重复元素)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for anot

javascript 判断数组中的重复内容的两种方法 by FungLeo

javascript 判断数组中的重复内容的两种方法 by FungLeo 前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数组,拿每一个字段和这个字符串进行比对,看是否有重复 如何拿A字符串和B字符串进行对比,并且要求判断出B字符串中包含过个A字符串呢? 方法一 indexOf() 和 lastIndexOf() 对比法. 首先,我们构建代码:

前端与算法 leetcode 26. 删除排序数组中的重复项

目录 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 概要 提示 解析 算法 # 前端与算法 leetcode 26. 删除排序数组中的重复项 题目描述 26. 删除排序数组中的重复项 概要 一提到原地删除数组,就能立即想到双指针法,这道题本身也没什么难度,日常水题, 提示 双指针 解析 没有思路的时候,耐心一点即可 算法 /** ?*[email protected]?{number[]}?nums ?*[email protected]?{number} ?*/

笔试算法题(29):判断元素范围1到N的数组是否有重复数字 &amp; 计算整数的7倍

出题:一个长度为N的数组,其中的元素取值范围是1到N,要求快速判断数组是否存在重复数字: 分析: 解法1:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素之,通过将当前元素k交换到其本身应该在的位 置k,也就是k=array[i], array[array[i],并判断是否存在duplication或者已经就绪.时间复杂度O(N),空间复杂度O(1): 解法2:由于元素取值范围确定,可以使用BitMap将数组元素映射到对应的位置,如果一个位置对应了两

数组组合排列及排序

//组合排列let array = ['1','2','3'] function getGroup(data, index = 0, group = []) { let need_apply = []; need_apply.push(data[index]); for (var i = 0; i < group.length; i++) { need_apply.push(group[i] + ' ' + data[index]); } group.push.apply(group, need

我的Java开发学习之旅------&gt;使用循环递归算法把数组里数据数组合全部列出

面试题如下:把一个数组里的数组合全部列出,比如1和2列出来为1,2,12,21. (面试题出自<Java程序员面试宝典>) 代码如下: import java.util.Arrays; import java.util.LinkedList; import java.util.List; /** * 把一个数组里的数组集合全部列出,比如1和2列出来为1,2,12,21 */ public class ListAll { public static void main(String[] args

组合排列的实现方法

最近在做数据分析系统,里面涉及到组合排列的问题,查找了很多的资料,但是感觉很多资料都是比较零散的,达不到项目需求. 后来经过一段的时间的探索,终于实现了组合排列的功能.下面我就来简单说说吧. 需求描述:   要实现的功能就是字符或数字的组合排列.例如:ab 的所有组合为:ab,ba :  ab的所有不重复排列为:ab. 其实这也是彩票中常说的直选和组选.效果图如下: 功能实现 这里就不多说了,直接贴上实现代码吧. 1.窗体界面设计 设计代码: 1 partial class FrmDemo 2