Умножить два массива разной длины в PHP? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть динамический массив:

$variants = [
    'color' => ['Blue', 'Red', 'Pink'],
    'size' => ['X', 'S'],
    ... (maybe more elements like above or not)
];

Я ожидаю этого:

$result = [
    0 => ['color' => 'Blue', 'size' => 'X'],
    1 => ['color' => 'Blue', 'size' => 'S'],
    2 => ['color' => 'Red', 'size' => 'X'],
    3 => ['color' => 'Red', 'size' => 'S'],
    4 => ['color' => 'Pink', 'size' => 'X'],
    5 => ['color' => 'Pink', 'size' => 'S']
];

Результатом является умножение всех длин массива. Я искал, но пока не нашел решения. Надеюсь, кто-нибудь может помочь. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Функция, которая делает то, что вы хотите

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_value) {
                $tmp[] = array_merge($result_item, array($property => $property_value));
            }
        }
        $result = $tmp;
    }
    return $result;
}

$variants = [
    'color' => ['Blue', 'Red', 'Pink'],
    'size' => ['X', 'S']
];

$result = get_combinations($variants);

Результат будет таким, как вы хотите.

0 голосов
/ 18 октября 2019

Это немного сложно, для этого вам нужно подготовить и выполнить этап агрегации. Но это возможно без возврата к рекурсии:

<?php
$variants = [
    'color' => ['Blue', 'Red', 'Pink'],
    'size' => ['X', 'S'],
    'weight' => [150, 250]
];

$result = [];
foreach ($variants as $key => $set) {
    foreach ($set as $entry) {
        $result[] = [$key => $entry];
    }
    break;
}
array_shift($variants);

foreach($variants as $setKey => $set) {
    $buffer = $result;
    $result = [];

    foreach ($set as $entry) {

        foreach ($buffer as $buf) {
            $result[] = array_merge($buf, [$setKey => $entry]);
        }
    }
}

var_dump($result);

Вывод этого:

array(12) {
  [0]=>
  array(3) {
    ["color"]=>
    string(4) "Blue"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(150)
  }
  [1]=>
  array(3) {
    ["color"]=>
    string(3) "Red"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(150)
  }
  [2]=>
  array(3) {
    ["color"]=>
    string(4) "Pink"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(150)
  }
  [3]=>
  array(3) {
    ["color"]=>
    string(4) "Blue"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(150)
  }
  [4]=>
  array(3) {
    ["color"]=>
    string(3) "Red"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(150)
  }
  [5]=>
  array(3) {
    ["color"]=>
    string(4) "Pink"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(150)
  }
  [6]=>
  array(3) {
    ["color"]=>
    string(4) "Blue"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(250)
  }
  [7]=>
  array(3) {
    ["color"]=>
    string(3) "Red"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(250)
  }
  [8]=>
  array(3) {
    ["color"]=>
    string(4) "Pink"
    ["size"]=>
    string(1) "X"
    ["weight"]=>
    int(250)
  }
  [9]=>
  array(3) {
    ["color"]=>
    string(4) "Blue"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(250)
  }
  [10]=>
  array(3) {
    ["color"]=>
    string(3) "Red"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(250)
  }
  [11]=>
  array(3) {
    ["color"]=>
    string(4) "Pink"
    ["size"]=>
    string(1) "S"
    ["weight"]=>
    int(250)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...