PHP 根据数组元素生成全部排列组合
发布于:
/**
* 返回给的数组的所有组合
* @email kavtong@163.com
* @param array $orignal 多维数组
* $orignal = array(
* array(1,2,3),
* array(4,5,6),
* array(7,8,9),
* );
* @return array(
* array(1,4,7),
* array(1,4,8),
* array(1,4,9),
* ...
* array(3,6,7),
* array(3,6,8),
* array(3,6,9),
* );
* 数组元素共: 3*3*3 = 27个
*/
public function getPermutation(array $orignal = []) {
// 排除非数组的参数
if (!is_array($orignal)) {
return [];
}
// 排除空数组
if (empty($orignal)) {
return [];
}
// 排除只有一个元素的数组
if (count($orignal) < 2) {
// 返回的目标数组
$targetTmp = array_shift($orignal);
// 返回结果集
return is_array($targetTmp) ? $targetTmp : [];
}
// 构建目标数组
$target = array_shift($orignal);
// 目标数组第一个元素格式化为数组
$target = is_array($target) ? $target : [];
// 下一个需要处理的数组
$tmp = array_shift($orignal);
// 非正常数据标识
$invalideParam = false;
// 数组且不为空
while (is_array($tmp) && !empty($tmp)) {
// 验证参数是否是一维数组
if (count($tmp) != count($tmp, COUNT_RECURSIVE)) {
$invalideParam = true;
break;
}
/**
* 原始数组的循环
* array(
* 0 =>1,
* 1 =>2,
* 2 =>3,
* );
*/
// 目标数组的临时变量
$targetTmp = [];
foreach ($target as $value) {
foreach ($tmp as $v) {
// 临时数组变量
$targetTmp[] = array_merge((array) $value, [$v]);
}
}
// 原始数组的替换
$target = $targetTmp;
// 移动数组的下一个元素
$tmp = array_shift($orignal);
}
// 存在非一维数组项
if ($invalideParam) {
return [];
}
// 返回结果集
return is_array($target) ? $target : [];
}
}
撰写评论