【问题标题】:cartesian product with PHP (id, name, variants)使用 PHP 的笛卡尔积(id、名称、变体)
【发布时间】:2016-04-02 02:21:13
【问题描述】:

你能帮我生成 Caresian 产品吗? 它类似于this stackoverflow。我想生成输入,所以我需要保留 ID。

例子:

我的输入数据:

[
  1 => [
    id => 1,
    name => "Color",
    options => [
       5 => [
         id => 5,
         name => "Red"
       ],
       6 => [
         id => 6,
         name => "Blue"
       ]
    ]
  ],
 2 => [
    id => 2,
    name => "Size",
    options => [
       7 => [
         id => 7,
         name => "S"
       ],
       8 => [
         id => 8,
         name => "M"
       ]
    ]
  ],

  // etc
]

我期望的结果:

[
 "5-7" => "Red / S",
 "5-8" => "Red / M",
 "6-7" => "Blue / S",
 "6-8" => "Blue / M"
]

我需要任意数量的属性/选项的通用函数..

【问题讨论】:

  • 到目前为止您尝试过什么?请先发布您尝试过的代码,然后我们可以看到您哪里出错了。
  • 我尝试了上面写的其他stackoverflow的解决方案,但这不是我的目的。

标签: php associative-array cartesian-product


【解决方案1】:

这实际上是目前有效的代码,但不知道效率如何。

// filter out properties without options
$withOptions = array_filter($properties, function($property) {
    return count($property['options']) > 0;
});

$result = [];

$skipFirst = true;

foreach ($withOptions as $property) {

    if ($skipFirst) {

        foreach (reset($withOptions)['options'] as $id => $option) {
            $result[$id] = $option['name'];
        }

        $skipFirst = false;
        continue;
    }

    foreach ($result as $code => $variant) {    
        foreach ($property['options'] as $id => $option) {
            $new = $code . "-" . $id;
            $result[$new] = $variant . " / " . $option['name'];
            unset($result[$code]);
        }
    }
}

【讨论】:

    【解决方案2】:

    嵌套循环人,数组 1 的每个条目都必须与数组 2 的每个条目链接。

    $finalArray = 数组();

    foreach (array1 as $key1 as $value1){
      foreach (array2 as $key2 as$value2){
       echo  $value1 . " - " .$value2."<br/>";
       $finalArray[$key1.'-'.$key2] =   $value1 ." - ".$value2;
     }
    }
    

    finalArray 将满足您的需求。

    【讨论】:

    • 我需要任意数量的“属性”的动态“函数”。可能有 2、3、4 .. 任意数量的带有选项的属性:)
    • 这将起作用..只需声明一个新数组并继续放置键和值..让我更新我的答案
    • 我明白了,但是我不能每次添加新属性时都编辑函数,它必须对任意数量的属性都是通用的。也许我们不了解对方:)
    • 你提到的那个帖子,你试过那个解决方案吗?我明白你的意思,你需要动态数量的数组..
    • 我试过了。但是输出与我的需要不同。 :) 它结合了所有字段,所以还有 id,name atc .. 它类似的问题但不一样,所以他们的解决方案不适合我的..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多