• 方法
namespace CarteSian;

class CarteSian
{

    /**
     * Store results
     *
     * @var array
     */
    public $products = [];

    /**
     * Calculate the Cartesian product
     *
     * @param array $params
     * @param array $temporary
     */
    public function carteSian(array $params, array $temporary = [])
    {
        foreach (
            array_shift($params) as $param
        ) {
            array_push($temporary, $param);
            $params ? $this->carteSian(
                $params, $temporary
            ) : array_push(
                $this->products, $temporary
            );
            array_pop($temporary);
        }
    }
}
  • 使用
$cartSian = new CarteSian();

$params = [[1,2],[3,4],[5,6]];

$cartSian->carteSian($params);

print_r($cartSian->products);
  • 结果
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 5
        )

    [1] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 6
        )

    [2] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 5
        )

    [3] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 6
        )

    [4] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 5
        )

    [5] => Array
        (
            [0] => 2
            [1] => 3
            [2] => 6
        )

    [6] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 5
        )

    [7] => Array
        (
            [0] => 2
            [1] => 4
            [2] => 6
        )

)

转自:分享一个递归计算笛卡尔积的方法