Декартово произведение ассоциативного массива, показывающее ключ и значение

У меня есть этот массив, и я использую его как ВХОД:

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
)
...
)

0

Решение

Я думаю, что получил, я погуглил «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)
}
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector