PHP рассчитать декартово произведение - PullRequest
1 голос
/ 27 марта 2019

Я работаю над слоем, который преобразует данные из многомерного массива в форму для соответствия устаревшим таблицам SQL.

Данные выглядят следующим образом

array(4) {
  "idnumber" =>
  array(1) {
    [0] =>
    string(6) "123456"
  }
  "names" =>
  array(2) {
    [0] =>
    string(8) "name1"
    [1] =>
    string(8) "name2"
  }
  "keycodes" =>
  array(3) {
    [0] =>
    int(101)
    [1] =>
    int(102)
    [2] =>
    int(103)
  }
}

Можноможет быть любое количество внешних элементов, и может быть любое количество внутренних элементов.

У меня возникают проблемы, когда я пытаюсь обернуть голову вокруг способа циклического обхода их и генерирования этого (ключи не имеют значения, этопросто мое первое видение их группировки)

array() {
  "123456name1101" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name1"
    [2] =>
    int(101)
  }
  "123456name2101" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name2"
    [2] =>
    int(101)
  }
  "123456name1102" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name1"
    [2] =>
    int(102)
  }
  "123456name2102" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name2"
    [2] =>
    int(102)
  }
  "123456name1103" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name1"
    [2] =>
    int(103)
  }
  "123456name2103" =>
  array(3){
    [0] =>
    string(6) "123456"
    [1] =>
    string(8) "name2"
    [2] =>
    int(103)
  }
}

Как я могу это сделать?

Спасибо

1 Ответ

1 голос
/ 27 марта 2019

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

function crossProduct($array1=[], $array2=[], $_=[]) {
    $_ = func_get_args();
    if (count($_) == 0) {
        return array(array());
    }
    $a = array_shift($_);
    $c = call_user_func_array(__FUNCTION__, $_);
    $r = array();
    foreach ($a as $v) {
        foreach ($c as $p) {
            $r[] = array_merge(array($v), $p);
        }
    }
    return $r;
}


$array = array(
  "idnumber" => array("123456"),
  "names" => array("name1", "name2"),
  "keycodes" => array(101, 102, 103)
);

$result = crossProduct($array["idnumber"], $array["names"], $array["keycodes"]);

Результат:

Array
(
    [0] => Array
        (
            [0] => 123456
            [1] => name1
            [2] => 101
        )

    [1] => Array
        (
            [0] => 123456
            [1] => name1
            [2] => 102
        )

    [2] => Array
        (
            [0] => 123456
            [1] => name1
            [2] => 103
        )

    [3] => Array
        (
            [0] => 123456
            [1] => name2
            [2] => 101
        )

    [4] => Array
        (
            [0] => 123456
            [1] => name2
            [2] => 102
        )

    [5] => Array
        (
            [0] => 123456
            [1] => name2
            [2] => 103
        )

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