Создать комбинацию пары из массива (abc -> ab: bc: ca или ac: ba: cb)

0

Я получил массив вроде

print_r($emails);

Вывод:

Array ( [0] => email1 [1] => email2 [2] => email3 [3] => email4 [4] => email5 )

Я хотел бы создать комбинации пары из $emails с примером вывода:

  • email1 имеет как combi email4

  • email2 имеет как combi email1

  • email3 имеет как combi email5

  • email4 имеет как combi email2

  • email5 имеет как combi email3

Таким образом, у вас не может быть "email1 имеет как combi mail1", а "email1 имеет как combi email3, а mail2 - как combi email3".

Также обратите внимание, что этот результат может быть различным в любое время, а массив $emails имеет переменное количество элементов (пример имел 5, но может быть 3 или более).

Я пытаюсь создать код для этого в течение нескольких часов... Поиск по всему Интернету. Я действительно надеюсь, что кто-то может мне помочь. Благодарю.

  • 0
    Вы создаете какой-то список? Что вы подразумеваете под: email1 has as combi email4 . Можете ли вы объяснить это более четко?
  • 0
    Ну, в конце концов я хочу отправить электронное письмо на email1, говоря: «Ваш партнер - это email4». Таким образом, комбинации могут быть либо сохранены в новом массиве, либо отправлены напрямую. Спасибо за интерес!
Теги:
arrays
combinations
pair

2 ответа

0
Лучший ответ

Если я правильно понимаю, каждое электронное письмо должно иметь "combi" (независимо от того, что есть) только для одного отдельного письма.

Это сводится к построению графика, где каждый узел имеет ровно одну исходящую (а не самореферентную) вершину, что означает, что она также имеет одну входящую вершину.

Это означает создание одного или всех графиков, которые разбиваются на циклы без синглтонов.

Например, для 5 элементов вы можете иметь либо один большой 1-> 2 → 3-> 4-> 5 цикл, либо два 1-> 2-> 3/4-> 5 циклов

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

Наилучшее приближение, которое я могу предложить, выглядит следующим образом:

  1. разделите свои "электронные письма" на подмножества, содержащие как минимум 2 элемента
  2. создавать циклы внутри каждого раздела

Проблема с этим подходом заключается в том, чтобы решить, как разбить свой первоначальный набор на получение однородного результата. Например, в случае с 5 элементами, как часто вы хотите иметь один 5-элементный цикл вместо раздела 3/2?

Я остановился на простом подходе: начальный набор сначала разрезается в любом положении, которое не создавало синглет, тогда одна из оставшихся частей проходит тот же процесс, пока исходный набор не будет исчерпан.
Рекурсивное разделение обоих (непустых) подмножеств, вероятно, приведет к более однородному результату, но, поскольку я не совсем уверен, что этот ответ соответствует вашим ожиданиям, я оставлю это на тот момент.

<?php
$num_nodes = 6; // number of "e-mails"

$nodes = range (1, $num_nodes); // these represent your e-mails
$vertex = Array();              // these represent your "has as combi " relation

shuffle($nodes); // random pick order

// partition nodes into subsets of at least 2 elements
$cycles = array();
while (count($nodes) > 0)
{
    $len = rand (1, count($nodes)-2);
    if ($len == 1) $len = 0; // take all remaining nodes
    $cycles[] = array_slice ($nodes, $len);
    array_splice ($nodes, $len);
}

// create cycles within each subset
echo "Partitions:\n";
foreach ($cycles as $cycle)
{
    foreach ($cycle as $node) echo "$node->"; echo "\n";
    $len = count ($cycle);
    for ($i = 0 ; $i != $len ; $i++) $vertex[$cycle[$i]] = $cycle[($i+1)% $len];
}

// here you go...
echo "\nRelations:\n";
foreach ($vertex as $origin=>$destination) echo "$origin -> $destination\n";

?>

Пример вывода:

C:\Dev\PHP\_StackOverflow\PHP>php email_graph.php
Partitions:
3->5->1->
4->6->2->

Relations:
3 -> 5
5 -> 1
1 -> 3
4 -> 6
6 -> 2
2 -> 4

C:\Dev\PHP\_StackOverflow\PHP>php email_graph.php
Partitions:
1->4->
6->5->3->2->

Relations:
1 -> 4
4 -> 1
6 -> 5
5 -> 3
3 -> 2
2 -> 6

C:\Dev\PHP\_StackOverflow\PHP>php email_graph.php
Partitions:
3->4->6->5->1->2->

Relations:
3 -> 4
4 -> 6
6 -> 5
5 -> 1
1 -> 2
2 -> 3
  • 0
    Ты удивительный! С некоторыми незначительными правками он делает именно то, что я хочу!
  • 0
    Рад помочь :)
0

После прочтения вашего вопроса и вашего разъяснения в своем комментарии я бы сказал, что вам нужен круговой связанный список. Такие как:

  email1 -> email2 -> email3 -> email1

Пока есть 3 или более электронных писем, никто не должен говорить с самим собой или с каким-либо электронным письмом, сделанным кем-то другим. Позиция email1 и email3 и все, что не имеет значения, поэтому оно может быть случайным, как вы упомянули.

Простыми словами, когда есть 3 человека:

  • Person1 смотрит на человека2
  • Person2 смотрит на человека3
  • Person3 смотрит на person1

Никогда не имеет значения, кто является человеком1, человеком2 или человеком3. Если бы Билл Гейтс был одним из трех человек, неважно, какой из них он есть. Дело в том, что он никогда не будет смотреть на себя или на кого-то, кого уже смотрел кто-то другой. Это просто для меня.

Надеюсь, я не слишком упростил его.

  • 0
    Спасибо за это :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню