PHP计算笛卡尔积

问题描述 投票:1回答:1

我正在开发一个层,将数据从多维数组转换为模具以适应旧的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)
  }
}

我怎样才能做到这一点?

谢谢

php cartesian-product
1个回答
1
投票

这是一些计算交叉乘积的代码。这不是我的代码,几年前我在网上找到它并且从那时起就开始使用它。我不记得它来自哪里。

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
        )

)
© www.soinside.com 2019 - 2024. All rights reserved.