多维数组的排列组合(商品多规格)算法[PHP]

<?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个
 */
function getPermutation(array $orignal = array()){
    // 排除非数组的参数
    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 = array();
        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:[];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。