PHP,使用所有其他数组值生成

PHP,使用所有其他数组值生成,php,arrays,function,combiners,Php,Arrays,Function,Combiners,我必须用其他数组值创建一个复杂数组 原始阵列是: Array ( [0] => Array ( [0] => A [1] => B [2] => C ) [1] => Array ( [0] => D [1] => E [2] => F ) ) 我正在寻找一个函数,它可以提供所有可能的组合值,如下所示: Array

我必须用其他数组值创建一个复杂数组

原始阵列是:

Array (
     [0] => Array (
        [0] => A
        [1] => B
        [2] => C
    )

    [1] => Array (
        [0] => D
        [1] => E
        [2] => F
    )
)
我正在寻找一个函数,它可以提供所有可能的组合值,如下所示:

Array (
  [0] => Array (A, D),
  [1] => Array (A, E),
  [2] => Array (A, F),
  [3] => Array (B, D),
  [4] => Array (B, E),
  [5] => Array (B, F),
  [6] => Array (C, D),
  [7] => Array (C, E),
  [8] => Array (C, F)
)
当然,即使原始数组中的值的数目不同,该算法也必须工作

我在PHP文档中寻找一个简单的函数来实现这一点,但我没有找到

我在谷歌上搜索了诸如多路复用或联合等关键词,但运气不佳。我认为最好的方法是生成一个递归函数,但我找不到正确的算法。

每个只需两个

$first = array('A', 'B', 'C', 'D');
$second = array('E', 'F', 'G');

$result = array();
foreach ($first as $f) {
    foreach ($second as $s) {
        $result[] = array($f, $s);
    }
}
var_dump($result);

这是我能想象到的最简单的动态事件:

它显示所有可能的组合

<?php

$origArray = array(
    array(
         "A",
         "B",
         "C"        
    ),
     array(
        "D",
        "E",
        "F"     
    )
);

$endArray = array();

foreach ($origArray as $key_1 => $value_1){
    foreach ($origArray as $key_2 => $value_2){
        if($key_1 == $key_2){
            continue;
        }
        foreach($value_1 as $key_1_1 => $value_1_1 ){
            foreach ($value_2 as $key_2_1 => $value_2_1){
                $endArray[] = array($value_1_1, $value_2_1);
            }
        }


    }

}
echo "<pre>";
var_dump($endArray);
echo "</pre>";
如果要显示firts子数组的所有组合,可以使用:

 $input = array(
    0 => array ('A','B','C'),
    1 => array ('D','E','F'),
    2 => array ('X','Y','Z'),
    /*...*/
);

$result = array();  
foreach($input as $sub_arr){
    $_result = array();
    foreach($sub_arr as $val){
        if($result){
            foreach($result as $old){
                $old[] = $val;
                $_result[] = $old;
            }
        }else{ 
            $_result[] = array($val);
        }
    }
    $result = $_result;
} 
array_multisort($result); //sort all layers alphabetically.
echo "<pre>";
print_r($result);

这适用于尽可能多的子_阵列。。它不是按原始输出排序的,但可以通过示例中的排序函数轻松解决:


工作示例:

计算笛卡尔积的简单递归函数:

输出 大堆 [0]=>阵列 [0]=>A [1] =>E [2] =>C [1] =>阵列 [0]=>B [1] =>E [2] =>C [2] =>阵列 [0]=>A [1] =>E [2] =>D [3] =>阵列 [0]=>B [1] =>E [2] =>D [4] =>阵列 [0]=>A [1] =>F [2] =>C [5] =>阵列 [0]=>B [1] =>F [2] =>C [6] =>阵列 [0]=>A [1] =>F [2] =>D [7] =>阵列 [0]=>B [1] =>F [2] =>D

基本上你想要一个笛卡尔的结果。下面是一个类似示例的链接,您是否会在子数组中不断有3个值??hi和tks作为您的答案。不,我的原始数组可以有X个带有数组的条目。您可以从子数组中获取所有元素,并创建一个包含所有元素的临时数组,然后使用我的答案查找所有2元素组合。这有用吗?Thks,但我不知道子阵列的数量。因此,如果有两个以上的子数组,您的代码将无法工作。如果有第三个子数组呢?那么输出应该是什么呢?很简单,那么每个输出元素包含三个元素。所有这些组合呢?然后这就有点困难了,但是使用递归函数就可以做到。是的,比如:echo count$endArray//18seconded example==9,但不是所有的组合,而是第一个子数组的所有组合。p忘了提到数组可以包含两个以上的元素。是的,这段代码仍然可以工作。它的工作原理是不会崩溃,但是一个包含三个元素的输入数组的预期输出应该是三个元素的集合。这个不错,+1。但是,[]在5.4之前的版本中不受支持,可以很容易地用数组替换它,而且它也可以正常工作:@TiborB您应该已经在使用PHP5.4了;PHP5.3是EOL,不再受支持,在处理您之前先处理它:我通常处理5.4+,但显然,PHPFiddle仍然是5.3.29://@TiborB。我以前从未使用过PHPFidle;我使用eval.in或3v4l。我认为这一个在没有递归函数的情况下模拟递归值得一试。它解决了任务…而且不需要使用递归。不过这是一项家庭作业。
 $input = array(
    0 => array ('A','B','C'),
    1 => array ('D','E','F'),
    2 => array ('X','Y','Z'),
    /*...*/
);

$result = array();  
foreach($input as $sub_arr){
    $_result = array();
    foreach($sub_arr as $val){
        if($result){
            foreach($result as $old){
                $old[] = $val;
                $_result[] = $old;
            }
        }else{ 
            $_result[] = array($val);
        }
    }
    $result = $_result;
} 
array_multisort($result); //sort all layers alphabetically.
echo "<pre>";
print_r($result);
function cartesian(array $data)
{
    function cartesian_r(array $data, array $path, &$out)
    {
        if (count($data) > 1) {
            // recursive step
            $head = array_slice($data, 0, -1);
            $tail = end($data);
            foreach ($tail as $item) {
                cartesian_r($head, array_merge($path, [$item]), $out);
            }
        } else {
            // unwind step
            foreach ($data[0] as $item) {
                $out[] = array_merge([$item], $path);
            }
        }
    }

    $out = [];
    cartesian_r($data, [], $out);

    return $out;
}

$out = cartesian([['A', 'B'], ['C', 'D'], ['E', 'F']]);

print_r($out);