Перестановки PHP за исключением аналогичной последовательности - PullRequest
1 голос
/ 07 ноября 2019

Моя перестановка / комбинации данных

$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"
  ]

... проблема начинается, когда я начинаю получать те же последовательности данных в моеминдексы массива case 0 и 20 будут одинаковыми, несмотря на любую позицию.

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

Основная идея состоит в том, чтобы сохранить уникальность массива $ комбинаций (alteration1, alteration2, alteration3) равной (alteration3, alstruction1, alstruction2)) поэтому он должен быть пропущен в массиве $ final. Я действительно не нашел ничего вокруг SO и Google. Спасибо за помощь. $ размерности данных [от 1 до 6], каждый массив внутри может быть [1 - 6]. Следующий скрипт может работать не так, как ожидалось.

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

1 Ответ

1 голос
/ 07 ноября 2019
  • Мы перебираем данные и сначала находим уникальные элементы для каждого набора, используя array_unique .

  • Затем мы natsort их получим отсортированную форму и сериализуем их, используя implode () . Сделав это, мы получим тот же сериализованный код для наборов ABC, CBA, BAC и т. Д.

  • Затем мы найдем дубликаты, используя проверку ключей внутри переменной, скажем $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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...