我有这个数组,我用它作为 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
)
...
)
答案 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)
}
}