объединить записи массива с каждой другой записью

Извините за заголовок, так как он выглядит как большинство других вопросов о комбинировании массивов, но я не знаю, как написать его более конкретно.

Мне нужна функция PHP, которая объединяет записи одного массива (динамический размер от 1 до любого) в строки во всех возможных комбинациях.

Вот пример с 4 записями:

$input = array('e1','e2','e3','e4);

Это должно быть результатом:

$result = array(
0 => 'e1',
1 => 'e1-e2',
2 => 'e1-e2-e3',
3 => 'e1-e2-e3-e4',
4 => 'e1-e2-e4',
5 => 'e1-e3',
6 => 'e1-e3-e4',
7 => 'e1-e4'
8 => 'e2',
9 => 'e2-e3',
10 => 'e2-e3-e4',
11 => 'e2-e4',
12 => 'e3',
13 => 'e3-e4',
14 => 'e4'
);

Сортировка входного массива важна, поскольку она влияет на вывод.
И, как вы видите, должен быть такой результат, как e1-e2 но нет e2-e1,

Это кажется действительно сложным, поскольку входной массив может иметь любое количество записей.
Я даже не знаю, существует ли математическая конструкция или имя, которое описывает такой случай.

Кто-нибудь делал это раньше?

4

Решение

Вы говорите, что в массиве может быть любое количество записей, поэтому я предполагаю, что вы не вставляете данные вручную, и какой-то источник или код вводят данные. Можете ли вы описать это? Может быть проще сохранить его в соответствии с вашими требованиями, чем иметь массив, а затем изменить его в соответствии с вашими требованиями

Это может быть полезно Нахождение подмножеств массива в PHP

1

Другие решения

Мне удалось собрать воедино код, который создает желаемый результат из имеющегося у вас ввода.
Я думаю, что понял логику того, когда и почему каждый элемент выглядит так, как он есть. Но я не уверен, поэтому проверьте его внимательно, прежде чем использовать его вживую.

Мне трудно объяснить код, так как это действительно бред.

Но я использую array_slice, чтобы получить значения, необходимые в строках, и взорвать, чтобы добавить - между значениями.

$in = array('e1','e2','e3','e4');

//$new =[];
$count = count($in);
Foreach($in as $key => $val){
$new[] = $val; // add first value

// loop through in to greate the long incrementing string
For($i=$key; $i<=$count-$key;$i++){
if($key != 0){
$new[] = implode("-",array_slice($in,$key,$i));
}else{
if($i - $key>1) $new[] = implode("-",array_slice($in,$key,$i));
}
}

// all but second to last except if iteration has come to far
if($count-2-$key >1) $new[] = Implode("-",Array_slice($in,$key,$count-2)). "-". $in[$count-1];

// $key (skip one) next one. except if iteration has come to far
If($count-2-$key >1) $new[] = $in[$key] . "-" . $in[$key+2];

// $key (skip one) rest of array except if iteration has come to far
if($count-2-$key > 1) $new[] = $in[$key] ."-". Implode("-",Array_slice($in,$key+2));

// $key and last item, except if iteration has come to far
if($count-1 - $key >1) $new[] = $in[$key] ."-". $in[$count-1];

}$new = array_unique($new); // remove any duplicates that may have been created

https://3v4l.org/uEfh6

0

вот модифицированная версия Нахождение подмножеств массива в PHP

function powerSet($in,$minLength = 1) {
$count = count($in);
$keys = array_keys($in);
$members = pow(2,$count);
$combinations = array();
for ($i = 0; $i < $members; $i++) {
$b = sprintf("%0".$count."b",$i);
$out = array();
for ($j = 0; $j < $count; $j++) {
if ($b{$j} == '1') {
$out[] = $keys[$j];
}
}
if (count($out) >= $minLength) {
$combinations[] = $out;
}
}
$result = array();
foreach ($combinations as $combination) {
$values = array();
foreach ($combination as $key) {
$values[$key] = $in[$key];
}
$result[] = implode('-', $values);
}
sort($result);
return $result;
}

Это похоже на работу.

0