Создать пары с 2 массивами, чтобы не было повторяющихся пар? - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь создать скрипт для создания пар из 2 разных массивов. Например, у меня есть два массива, приведенных ниже:

<?php
    //Array 1
    $arr1 = array('A', 'B', 'C', 'D');
    //Array 2
    $arr2 = array('X', 'Y', 'Z');

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

$output = array(
  0 => array('A', 'X'),
  1 => array('B', 'Y'),
  2 => array('C', 'Z'),
  3 => array('D', 'X'),
  4 => array('A', 'Y'),
  5 => array('B', 'Z'),
  6 => array('C', 'X'),
  7 => array('D', 'Y'),
  8 => array('A', 'Z'),
  9 => array('B', 'X'),
  10 => array('C', 'Y'),
  11 => array('D', 'Z')
)

** Примечание: 2 массива могут различаться в зависимости от количества и значений.

Ответы [ 4 ]

0 голосов
/ 03 мая 2018

это пример, который выводит уникальные значения в том же порядке:

онлайн-eval: https://3v4l.org/H2pad

<?php

function cartesian(array $x,array $y): array
{
    $result = [];
    $size = count($x) * count($y);
    $posX = 0;
    $posY = 0;
    for($i = 0; $i < $size; $i++) {
        if (!isset($x[$posX])) {
            $posX = 0;
        } elseif(!isset($y[$posY])) {
            $posY = 0;
        }
        $result[] = [$x[$posX],$y[$posY]];
        $posX++; $posY++;
    }
    return $result;
}

$x = array('A', 'B', 'C', 'D');

$y = array('X', 'Y', 'Z');

print_r(cartesian($x,$y));

(tbh, мне потребовалось много отладки резиновой утки)

0 голосов
/ 02 мая 2018

Это Декартово произведение . Может быть достигнуто с

//Array 1
$arr1 = array('A', 'B', 'C', 'D');
//Array 2
$arr2 = array('X', 'Y', 'Z');

$output = array();

foreach($arr1 as $i1){
    foreach ($arr2 as $i2) {
        $output[] = array($i1, $i2);
    }
}

echo json_encode($output);

Если вы хотите, чтобы вывод был в том же порядке, как вы упомянули выше, выполните следующие действия.

$newoutput = array();

$x = 0;
$y = 0;
for($i = 1; $i <= (count($arr1) * count($arr2)); $i++){
    $newoutput[] = array($arr1[($x % count($arr1))], $arr2[($y % count($arr2))]);
    $x++;
    $y++;
}

echo "<br />", json_encode($newoutput);

Вывод, однако, отличается от того же выхода, что и предыдущий.

EDIT

Второй работает только тогда, когда (count($arrX) % count($arrY)) > 0.

0 голосов
/ 02 мая 2018

Попробуйте это (Это будет отсортировать ту же пару, если найден):

//Array 1
$arr1 = array('A', 'B', 'C', 'D', 'A', 'E'); // Same element will be sort out in pair
//Array 2
$arr2 = array('X', 'Y', 'Z' , 'X', 'Y', 'X'); // Same element will be sort out in pair
$output = array();
$used_pair = array(); // Keeping used pair
$i = 1;
foreach ($arr1 as $each1) {
    foreach ($arr2 as $each2) {
        if (!in_array($each1.$each2, $used_pair)) {
            $output[] = array($each1, $each2);
            $used_pair[] = $each1 . $each2;
        }
    }
}
print_r($used_pair); // array with pair string
print_r($output); // array with pair array
0 голосов
/ 02 мая 2018

Я не думаю, что есть встроенная поддержка для этого.
Вы должны зациклить вложенные массивы и построить массив результатов.

$arr1 = array('A', 'B', 'C', 'D');
$arr2 = array('X', 'Y', 'Z');

foreach($arr1 as $item1){
    foreach($arr2 as $item2){
        $res[] = [$item1, $item2];
    }
}

var_dump($res);

https://3v4l.org/CdE8Q

...