关联数组的笛卡尔积显示键和值 - PHP

时间:2014-11-24 15:31:15

标签: php arrays cartesian-product

我有这个数组,我用它作为 INPUT

Array
(
    [0] => Array
        (
            [11134] => 3.430
            [11131] => 2.720
            [11128] => 1.077
        )

    [1] => Array
        (
            [11135] => 2.381
            [11132] => 2.636
            [11129] => 2.920
        )

    [2] => Array
        (
            [11136] => 1.220
            [11133] => 2.550
            [11130] => 3.895
        )

)

我需要打印此阵列的笛卡尔积。我使用了位于here的答案,但它根本不能帮助我。我修改了Jon发布的函数以使其更快(实际上只是为array_shift切换array_pop所以它不会将数组重新索引为数字):

function cartesian($input) {
    $result = array();

    while (list($key, $values) = each($input)) {
        if (empty($values)) {
            continue;
        }

        if (empty($result)) {
            foreach($values as $value) {
                $result[] = array($key => $value);
            }
        }
        else {

            $append = array();

            foreach($result as &$product) {
                $product[$key] = array_pop($values);

                $copy = $product;

                foreach($values as $item) {
                    $copy[$key] = $item;
                    $append[] = $copy;
                }

                $values[] = $product[$key];
            }

            $result = array_merge($result, $append);
        }
    }

    return $result;
}

给出的答案打印出以下数组:

Array
(
    [0] => Array
        (
            [0] => 3.430
            [1] => 2.920
            [2] => 3.895
        )

    [1] => Array
        (
            [0] => 2.720
            [1] => 2.920
            [2] => 3.895
        )
    ...
)

这不是我想要的。该功能的期望的输出是:

Array
(
    [0] => Array
        (
            [11134] => 3.430
            [11129] => 2.920
            [11130] => 3.895
        )

    [1] => Array
        (
            [11131] => 2.720
            [11129] => 2.920
            [11130] => 3.895
        )
    ...
)

我想出了如何使我的新数组的第一个元素看起来像我需要的那样,代码的一部分看起来像这样:

if (empty($result)) {
    foreach($values as $key => $value) {
        $result[] = array($key => $value);
    }
}

但那就是我被困的地方。我无法获取其他值以获取其键并显示为键。我设法得到的最终数组看起来像这样。

Array
(
    [0] => Array
        (
            [11134] => 3.430
            [1] => 2.920
            [2] => 3.895
        )

    [1] => Array
        (
            [11131] => 2.720
            [1] => 2.920
            [2] => 3.895
        )
    ...
)

1 个答案:

答案 0 :(得分:1)

我想我明白了,我用谷歌搜索了#34; PHP组合" (假设组合类似于笛卡尔积,我认为它是:s)并使用this code as a base。我需要做的改变不是合并我必须使用联合的数组,因为根据php手册:

  

带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。

  

如果要将第二个数组中的数组元素追加到第一个数组而不覆盖第一个数组中的元素而不重新编制索引,请使用+ array union运算符。 ...将保留第一个数组中的键。如果两个数组中都存在数组键,则将使用第一个数组中的元素,并忽略第二个数组中匹配键的元素。

CODE:

<?php
 $temp = Array
(
    "0" => Array
        (
            "11134" => 3.430,
            "11131" => 2.720,
            "11128" => 1.077
        ),

    "1" => Array
        (
            "11135" => 2.381,
            "11132" => 2.636,
            "11129" => 2.920
        ),

    "2" => Array
        (
            "11136" => 1.220,
            "11133" => 2.550,
            "11130" => 3.895
        )

);


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;
}

$combinations = get_combinations($temp);

var_dump($combinations);
?>

结果:

array(27) {
  [0]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11135]=>
    float(2.381)
    [11136]=>
    float(1.22)
  }
  [1]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11135]=>
    float(2.381)
    [11133]=>
    float(2.55)
  }
  [2]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11135]=>
    float(2.381)
    [11130]=>
    float(3.895)
  }
  [3]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11132]=>
    float(2.636)
    [11136]=>
    float(1.22)
  }
  [4]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11132]=>
    float(2.636)
    [11133]=>
    float(2.55)
  }
  [5]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11132]=>
    float(2.636)
    [11130]=>
    float(3.895)
  }
  [6]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11129]=>
    float(2.92)
    [11136]=>
    float(1.22)
  }
  [7]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11129]=>
    float(2.92)
    [11133]=>
    float(2.55)
  }
  [8]=>
  array(3) {
    [11134]=>
    float(3.43)
    [11129]=>
    float(2.92)
    [11130]=>
    float(3.895)
  }
  [9]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11135]=>
    float(2.381)
    [11136]=>
    float(1.22)
  }
  [10]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11135]=>
    float(2.381)
    [11133]=>
    float(2.55)
  }
  [11]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11135]=>
    float(2.381)
    [11130]=>
    float(3.895)
  }
  [12]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11132]=>
    float(2.636)
    [11136]=>
    float(1.22)
  }
  [13]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11132]=>
    float(2.636)
    [11133]=>
    float(2.55)
  }
  [14]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11132]=>
    float(2.636)
    [11130]=>
    float(3.895)
  }
  [15]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11129]=>
    float(2.92)
    [11136]=>
    float(1.22)
  }
  [16]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11129]=>
    float(2.92)
    [11133]=>
    float(2.55)
  }
  [17]=>
  array(3) {
    [11131]=>
    float(2.72)
    [11129]=>
    float(2.92)
    [11130]=>
    float(3.895)
  }
  [18]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11135]=>
    float(2.381)
    [11136]=>
    float(1.22)
  }
  [19]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11135]=>
    float(2.381)
    [11133]=>
    float(2.55)
  }
  [20]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11135]=>
    float(2.381)
    [11130]=>
    float(3.895)
  }
  [21]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11132]=>
    float(2.636)
    [11136]=>
    float(1.22)
  }
  [22]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11132]=>
    float(2.636)
    [11133]=>
    float(2.55)
  }
  [23]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11132]=>
    float(2.636)
    [11130]=>
    float(3.895)
  }
  [24]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11129]=>
    float(2.92)
    [11136]=>
    float(1.22)
  }
  [25]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11129]=>
    float(2.92)
    [11133]=>
    float(2.55)
  }
  [26]=>
  array(3) {
    [11128]=>
    float(1.077)
    [11129]=>
    float(2.92)
    [11130]=>
    float(3.895)
  }
}