У меня есть этот массив, и я использую его как ВХОД:
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
)
)
Мне нужно распечатать декартово произведение этого массива. Я использовал ответ, расположенный Вот, но это действительно не помогает мне вообще. Я изменил функцию, которую Джон опубликовал, чтобы сделать это быстрее (на самом деле просто переключил 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
)
...
)
Я думаю, что получил, я погуглил «PHP комбинации» (Предполагая, что комбинация похожа на декартово произведение, я думаю, что это: s) и использовал этот код в качестве основы. Изменения, которые мне нужно было сделать, заключались в том, чтобы вместо объединения массивов мне пришлось использовать объединение, потому что согласно руководству по php:
Значения во входном массиве с цифровыми ключами будут перенумерованы с увеличивающимися ключами, начинающимися с нуля в массиве результатов.
а также
Если вы хотите добавить элементы массива из второго массива в первый массив, не перезаписывая элементы из первого массива и не переиндексируя, используйте оператор объединения + массив. … Ключи от первого массива будут сохранены. Если ключ массива существует в обоих массивах, то будет использоваться элемент из первого массива, а соответствующий элемент ключа из второго массива будет игнорироваться.
КОД:
<?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)
}
}
Других решений пока нет …