【问题标题】:PHP Permutations with exception of similar sequencePHP 排列,除了相似的序列
【发布时间】:2019-11-07 13:25:56
【问题描述】:

我的数据排列/组合

$combinations = [[]];
$data = [

        ['alteration1', 'alteration2', 'alteration3', 'alteration4' ... upto 5 each],
        ['alteration1', 'alteration5', 'alteration6', 'alteration7' ... upto 5 each],
        ['alteration8', 'alteration9', 'alteration10', 'alteration5' ... upto 5 each],
        ... upto 6 max
    ];

    $length = count($data);

    for ($count = 0; $count < $length; $count++) {
        $tmp = [];
        foreach ($combinations as $v1) {
            foreach ($data[$count] as $v2)
                $tmp[] = array_merge($v1, [$v2]);

        }
        $combinations = $tmp;
    }

  print_r($combinations);

脚本会生成这样的集合

 0 => array:3 [▼
    0 => "alteration1"
    1 => "alteration1"
    2 => "alteration8"
  ]
  1 => array:3 [▼
    0 => "alteration1"
    1 => "alteration1"
    2 => "alteration9"
  ]

...当我开始在我的案例中获取相同的数据序列时,问题就开始了,数组索引 0 和 20 将完全相同,尽管有任何位置。

 20 => array:3 [▼
        0 => "alteration8"
        1 => "alteration1"
        2 => "alteration1"
      ]
      21 => array:3 [▼
        0 => "alteration1"
        1 => "alteration9"
        2 => "alteration1"
      ]
 $final = []; // remove duplicates

基本思想是保持 $combinations 数组的唯一性 (alteration1,alteration2,alteration3) 等于 (alteration3,alteration1,alteration2) 否则它应该在 $final 数组中被跳过。我还没有在 SO 和谷歌周围找到任何东西。谢谢您的帮助。 $data 维度[从1-6],里面的每个数组可以是[1-6]。以下脚本可能无法按预期工作。

http://sandbox.onlinephpfunctions.com/code/3ad5084386c2185f7619aaac152b638873039ee8

【问题讨论】:

  • 什么可能重复?
  • (alteration1,alteration2,alteration3) 等于 (alteration3,alteration1,alteration2) f.e 任何重复的相同组合,简化的 ABC = BCA = CBA 应该检查最多 6 个元素(并且只返回 1 )位置无所谓

标签: php multidimensional-array permutation


【解决方案1】:
  • 我们遍历数据并首先使用array_unique 为每个集合找到唯一元素。

  • 然后我们natsort 他们得到一个排序的表单并使用implode() 序列化它们。通过这样做,我们将得到集合ABCCBABAC 等的相同序列化代码。

  • 然后我们使用变量内的键检查来查找重复项,例如$set。如果设置了序列化键,我们会将其从结果中排除,否则我们会将其包含在最终结果中。

片段:

<?php

$data = [
    ['alteration1', 'alteration4',],
    ['alteration2','alteration3'],
    ['alteration2','alteration3'],
    []
];


$combinations = [[]];

foreach($data as $index => $current_data){
   $current_data = array_unique($current_data);   
   if(empty($current_data)) continue; 
   $temp_combinations = [];
   foreach($current_data as $value){
       foreach($combinations as $each_combination){
           $temp_combinations[] = array_merge($each_combination,[$value]);
       }
   }

   $combinations = $temp_combinations;

}

$set = [];
$unique_combinations = [];

foreach($combinations as $each_combination){
    natsort($each_combination);
    $serialized_form = implode(",",$each_combination);
    if(isset($set[$serialized_form])) continue;
    if(empty($each_combination)) continue;
    $unique_combinations[] = $each_combination;
    $set[$serialized_form] = true;
}

print_r($unique_combinations);

演示: https://3v4l.org/Do6oH

【讨论】:

  • 如果数组为空怎么办,这也可能是一种情况,否则它可以工作
  • @KavvsonEmpcraft 等等,有一个错误。我正在修。
  • @KavvsonEmpcraft 我已经更新了我的答案。我还在代码中添加了一个测试数据集,它只打印一次1,2,3 的组合,其他的也是如此。最初,它同时提供1,3,21,2,3
  • @KavvsonEmpcraft 还添加了对空数据的检查。
  • 3v4l.org/F8NNH 考虑第 7 行,这就是我的意思
猜你喜欢
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 2015-10-20
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多