PHP: вложенный цикл только с уникальными парами - PullRequest
0 голосов
/ 22 июня 2019

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

Итак, вот небольшой пример:

<?php 

$teams = [
    ['id' => 1],
    ['id' => 2],
    ['id' => 3],
    ['id' => 4],
];

foreach ($teams as $team_a) {
    foreach ($teams as $team_b) {
        if ($team_a['id'] !== $team_b['id']) {
            $pairs[] = [$team_a['id'], $team_b['id']];
        }
    }
}

?>

Возвращает что-то вроде этого:

0: [1, 2]
1: [1, 3]
2: [1, 4]
3: [2, 1]
4: [2, 3]
5: [2, 4]
6: [3, 1]
7: [3, 2]
8: [3, 4]
...

Итак, вы можете видеть, что некоторые пары одинаковы, например, [1, 2] и [2, 1].А после половины итераций остаются только повторы.

Какой самый эффективный способ итерации подобен этому и быть уверенным, что есть только уникальные пары?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Очевидно, что дубликат всегда появляется, когда ключ (team_a)> ключ (team_b)

<?php 

$teams = [
    ['id' => 1],
    ['id' => 2],
    ['id' => 3],
    ['id' => 4],
];

foreach ($teams as $offset => $team_a) {
    foreach (array_slice($teams, $offset+1) as $team_b) {
        $pairs[] = [$team_a['id'], $team_b['id']];
    }
}
1 голос
/ 22 июня 2019

Вы можете сделать это с помощью рекурсии вместо двух для каждого цикла.

<?php

$teams = [1, 2, 3, 4, 5, 6, 7, 8, 9 , 10];

getMatchup($teams);

function getMatchUp($teams, $matches = [], $start = 0) {
    // Check if the whole array has been checked
    if ($start == count($teams)) {
        return var_dump($matches);
    }
    // Check every option considering a certain start point
    for ($x = $start; $x < count($teams); $x++) {

        // As long the team is not the same, add to matches
        if ($start !== $x) {
            $matches[] = [$teams[$start] => $teams[$x]];
        }
    }
    // First team has been matched up, start matching the second team and so on..
    getMatchup($teams,$matches, $start + 1);
}

Бегущий пример: http://sandbox.onlinephpfunctions.com/code/4277d966c4ceacdbe7024d14fb03fe05fd760471

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