【问题标题】:Multiply two arrays with different length in PHP?在PHP中将两个不同长度的数组相乘?
【发布时间】:2019-10-18 16:24:01
【问题描述】:

我有一个动态数组:

$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']
];

结果是所有数组长度的乘积。我已经搜索但尚未找到解决方案。希望任何人都可以提供帮助。非常感谢!

【问题讨论】:

  • 到目前为止,您自己有没有尝试过?
  • 是的,我尝试在所有内部数组中创建一个嵌套循环。但是对于动态数组长度,我还没有找到解决方案!
  • 那么请向我们展示您目前拥有的代码

标签: php arrays multiplication


【解决方案1】:

这有点棘手,您需要为此做好准备和聚合步骤。但是不回退到递归也是可能的:

<?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)
  }
}

【讨论】:

  • 这不适用于复杂数组,但可以调整。如果输入数组的形式为 array('color'=>array(array('id'=>123, 'name'=>'blue', 'texture'=>'rough'), array('id' =>456, '名称'=>'红色', '纹理'=>'平滑'), ...), ...);您将丢失键值对,但可以从内部数组中取回它们。
  • 完全正确。此处的此问题并未要求这样做,因此此处的 OP 未要求这样做,这就是为什么未在此答案中实现它的原因。你可以让它适应更复杂的情况当然是正确的。
【解决方案2】:

一个功能,让你想要什么

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

结果会如你所愿。

【讨论】:

  • 它使用的 foreach 循环少于接受的答案。或多或少是一样的。
  • 是的,因为他排在第一位,而且效果很好 :(。无论如何,非常感谢您的简短而出色的功能!
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2021-07-19
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多