为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何在PHP中生成多个数组中所有项的组合

请问如何在PHP中生成多个数组中所有项的组合

PHP
慕尼黑8549860 2019-11-06 10:05:55
如何在PHP中生成多个数组中所有项的组合我试图在几个数组中找到所有项目的组合。数组的数目是随机的(这可以是2,3,4,5.)。每个数组中的元素数也是随机的.举个例子,我有三个数组:$arrayA = array('A1','A2','A3');$arrayB = array('B1','B2','B3');$arrayC = array('C1','C2');我想要生成一个3x3x2=18个组合的数组:A1,B1,C1A1,B1,C2A1,B2,C1A1,B2,C2A1,B3,C1A1,B3,C2A2,B1,C1A2,B1,C2.问题是要创建一个具有可变数量的源数组的函数.
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

下面是递归解决方案:

function combinations($arrays, $i = 0) {
    if (!isset($arrays[$i])) {
        return array();
    }
    if ($i == count($arrays) - 1) {
        return $arrays[$i];
    }

    // get combinations from subsequent arrays
    $tmp = combinations($arrays, $i + 1);

    $result = array();

    // concat each array from tmp with each element from $arrays[$i]
    foreach ($arrays[$i] as $v) {
        foreach ($tmp as $t) {
            $result[] = is_array($t) ? 
                array_merge(array($v), $t) :
                array($v, $t);
        }
    }

    return $result;}print_r(
    combinations(
        array(
            array('A1','A2','A3'), 
            array('B1','B2','B3'), 
            array('C1','C2')
        )
    ));



查看完整回答
反对 回复 2019-11-07
?
慕沐林林

TA贡献2016条经验 获得超9个赞

这是笛卡儿的产品,我不久前也问过同样的问题..这是发布在PHP网站上的算法.

function array_cartesian_product($arrays){
    $result = array();
    $arrays = array_values($arrays);
    $sizeIn = sizeof($arrays);
    $size = $sizeIn > 0 ? 1 : 0;
    foreach ($arrays as $array)
        $size = $size * sizeof($array);
    for ($i = 0; $i < $size; $i ++)
    {
        $result[$i] = array();
        for ($j = 0; $j < $sizeIn; $j ++)
            array_push($result[$i], current($arrays[$j]));
        for ($j = ($sizeIn -1); $j >= 0; $j --)
        {
            if (next($arrays[$j]))
                break;
            elseif (isset ($arrays[$j]))
                reset($arrays[$j]);
        }
    }
    return $result;}



查看完整回答
反对 回复 2019-11-07
?
慕森王

TA贡献1777条经验 获得超3个赞

这段代码除了简单外,还可以获得多个数组的所有组合并保留键。

function get_combinations($arrays) {
    $result = array(array());
    foreach ($arrays as $property => $property_values) {
        $tmp = array();
        foreach ($result as $result_item) {
            foreach ($property_values as $property_key => $property_value) {
                $tmp[] = $result_item + array($property_key => $property_value);
            }
        }
        $result = $tmp;
    }
    return $result;}

例:

Array(
    Array
    (
        '1' => 'White',
        '2' => 'Green',
        '3' => 'Blue'
    ),
    Array
    (
        '4' =>' Small',
        '5' => 'Big'
    ))

将返回:

Array(
    [0] => Array
    (
        [1] => White
        [4] =>  Small
    )
    [1] => Array
    (
        [1] => White
        [5] => Big
    )
    [2] => Array
    (
        [2] => Green
        [4] =>  Small
    )
    [3] => Array
    (
        [2] => Green
        [5] => Big
    )
    [4] => Array
    (
        [3] => Blue
        [4] =>  Small
    )
    [5] => Array
    (
        [3] => Blue
        [5] => Big
    ))



查看完整回答
反对 回复 2019-11-07
  • 3 回答
  • 0 关注
  • 334 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信