Создайте двоичный массив Pairing из динамического ассоциативного массива на основе ключей, по одному элементу от каждого ключа - PullRequest
1 голос
/ 20 апреля 2019

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

    [parent_id] => Array
            (
                [9] => Array
                    (
                        [0] => 11
                        [1] => 12
                    )

                [10] => Array
                    (
                        [0] => 13
                        [1] => 14
                    )

                [20] => Array
                    (
                        [0] => 21
                        [1] => 22
                    )
                [21] => Array
                    (
                        [0] => 23
                    )

            )

Это ассоциативный массив, который дает 3 пары прямо сейчас. Например
пара 1 содержит: 11, 13
пара 2 содержит: 12, 14
пара 3 содержит: 21, 23

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

1 Ответ

2 голосов
/ 20 апреля 2019

Обновление 3

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

function find_pairs($array) {
    // re-index to 0
    $array = array_values($array['parent_id']);
    // sort so the longest arrays are first
    usort($array, function ($a, $b) { return count($b) - count($a); });
    // output array
    $pairs = array();
    $c = count($array);
    $i = 0;
    // loop while there are enough values to pair (2 or more)
    while (array_reduce($array, function ($c, $v) { return $c + count($v); }, 0) > 1) {
        // make sure there are some elements in this array
        while (!count($array[$i])) $i = ($i + 1) % $c;
        // find the next array with a value
        $j = ($i + 1) % $c;
        while (!count($array[$j])) $j = ($j + 1) % $c;
        // have we come full circle?
        if ($j == $i) break;
        // save the pair
        $pairs[] = array(array_shift($array[$i]), array_shift($array[$j]));
        // move on to the next array
        $i = ($i + 1) % $c;
    }
    return $pairs;
}

Демонстрация (включает все возможные тестовые примеры) на 3v4l.org

Оригинальный ответ

Вот один из способов сделать это.Переиндексируйте массив parent_id, чтобы начать с 0, а затем выполните цикл по 2 элементам массива за раз, объединяя все значения каждого элемента.Мы используем min, чтобы убедиться, что мы объединяем столько значений, сколько имеется в массиве наименьших значений.

// re-index to 0
$array = array_values($array['parent_id']);
// output array
$pairs = array();
for ($i = 0; $i < count($array) - 1; $i += 2) {
    for ($j = 0; $j < min(count($array[$i]), count($array[$i+1])); $j++) {
        $pairs[] = array($array[$i][$j], $array[$i+1][$j]);
    }
}
print_r($pairs);

Вывод:

Array (
  [0] => Array ( [0] => 11 [1] => 13 )
  [1] => Array ( [0] => 12 [1] => 14 ) 
  [2] => Array ( [0] => 21 [1] => 23 ) 
)

Демонстрация на 3v4l.org

Update

Если вы хотите гарантировать получение максимального количества пар из массива, сортируйте, чтобы самые длинные массивы были первыми:

$array = array_values($array['parent_id']);
// sort so the longest arrays are first
usort($array, function ($a, $b) { return count($b) - count($a); });
// output array
$pairs = array();
for ($i = 0; $i < count($array) - 1; $i += 2) {
    for ($j = 0; $j < min(count($array[$i]), count($array[$i+1])); $j++) {
        $pairs[] = array($array[$i][$j], $array[$i+1][$j]);
    }
}
print_r($pairs);

Демонстрация на 3v4l.org

Обновление 2

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

function find_pairs($array) {
    // re-index to 0
    $array = array_values($array['parent_id']);
    // sort so the longest arrays are first
    usort($array, function ($a, $b) { return count($b) - count($a); });
    // output array
    $pairs = array();
    for ($i = 0, $j = 1; $i < count($array) - 1; $i++) {
        if (!count($array[$i])) continue;
        while ($j <= $i || $j < count($array) && !count($array[$j])) $j++;
        while (count($array[$i]) && isset($array[$j]) && count($array[$j])) {
            $pairs[] = array(array_shift($array[$i]), array_shift($array[$j]));
            // exhausted other arrays elements?
            while ($j < count($array) && !count($array[$j])) $j++;
        }
    }
    return $pairs;
}

Демонстрация на 3v4l.org

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