Сгенерировать пары из массива

55
13 февраля 2018, 09:09

Здравствуйте! Есть массив:

array(1,7,9,10);

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

array(1,7);
array(1,9);
array(1,10);
array(7,9);
array(7,10);
array(9,10);

То-есть все числа встречаются в парах, так-же бывает, что нужно сгенерировать эти пары несколько раз, причем так, чтобы они менялись местами. Например если нужно это сделать 3 раза - получится что числа 1 и 7 встретятся 3 раза так в паре:

array(1,7);
array(7,1);
array(1,7);
Answer 1

Я бы сделал проще и универсальнее. Пусть это будет одна функция, которая принимает исходные данные и количество повторений.

Код:

<?php
function generateArrayPairs(array $data, int $repeat = 1) {
    $data = array_values($data); // Чтобы убедиться, что индексы идут по порядку
    $result = []; // Контейнер с результатом
    foreach ($data as $outerKey => $outerElement) {
        $internalData = array_slice($data, $outerKey + 1); // для формирования пары оставляем только элементы справа от текущего 
        foreach ($internalData as $innerKey => $innerElement) {
            $pair = [$outerElement, $innerElement]; // Сохраняем, т.к. в случае повторения пара нам ещё понадобится
            $result[] = $pair; // Добавляем пару в результат
            if ($repeat > 1) {
                $reversedPair = [$innerElement, $outerElement]; // Тоже сохраняем, чтобы не генерировать кучу раз.
                for ($i = 2; $i <= $repeat; $i++) {
                    $result[] = ($i % 2 == 0) ? $reversedPair : $pair; // меняем элементы местами каждое 2-е повторение
                }
            }
        }
    }
    return $result;
}

Поиграться и посмотреть результат можно здесь: http://sandbox.onlinephpfunctions.com/code/1b487ef1efb283df6244349fcad0ef3af2a4ed51

Answer 2

Это только по уникальным парам, правила повторения не указаны.

$data = array(1,8,9,10);
$final = array();
for($index = 0; $index < count($data); $index++) {
    for ($subIndex = $index; $subIndex < count($data); $subIndex++) {
        $first = $data[$index];
        $second = $data[$subIndex];
        if($index != $subIndex && (!isset($data[$index . '-' . $subIndex]) || !isset($data[$subIndex . '-' . $index]))) {
            $final[$index . '-' . $subIndex] = array($data[$index], $data[$subIndex]);
        }
    }
}
$final = array_values($final);
READ ALSO
preg_match массивая [1]

preg_match массивая [1]

Добрый день

65
Дубликаты SELECT MAX

Дубликаты SELECT MAX

Скажем есть таблица accounts, в ней поле account_bagДопустим уже есть строка со значением 1, перед INSERT использую SELECT MAX, чтобы следующая строка была...

37
Invalid Parameter – yii\base\InvalidParamException The file or directory to be published does not exist: /frontend/web

Invalid Parameter – yii\base\InvalidParamException The file or directory to be published does not exist: /frontend/web

Переносил сайт с одного сервера на другой с базой данных postgresqlБазу подключил

81
Как через CLI задать параметры из php.ini

Как через CLI задать параметры из php.ini

PHP скрипт запускаю через CLI

60