首页 >后端开发 >php教程 >如何在保留键值对的同时计算 PHP 关联数组的笛卡尔积?

如何在保留键值对的同时计算 PHP 关联数组的笛卡尔积?

Patricia Arquette
Patricia Arquette原创
2024-12-27 01:40:11748浏览

How to Compute the Cartesian Product of PHP Associative Arrays While Preserving Key-Value Pairs?

使用 PHP 关联数组查找笛卡尔积,保留键值对

给定一个具有多个代表不同属性的子数组的关联数组,任务是计算笛卡尔积,同时保留密钥及其对应的

基本原理

对于有 N 个子数组的数组 $input,其中每个子数组有 Cn 个元素,我们可以继续归纳:

  • 对于 N = 1,笛卡尔积就是输入数组
  • 假设我们有前 N-1 个子数组的笛卡尔积,我们可以通过以下方式计算第 N 个子数组的乘积:

    • 产品中的每个项目(数组),添加 KN => 对VN,1.
    • 对于 VN,2 到 VN,CN 的每个值,将每个项目的副本添加到产品中,将 KN 的值更改为 VN,m(对于所有 2 ≤ m ≤ CN).

代码

function cartesian($input) {
    $result = [];

    while (list($key, $values) = each($input)) {
        if (empty($values)) {
            continue;
        }

        if (empty($result)) {
            foreach ($values as $value) {
                $result[] = [$key => $value];
            }
        } else {
            $append = [];

            foreach ($result as &$product) {
                $product[$key] = array_shift($values);
                $copy = $product;

                foreach ($values as $item) {
                    $copy[$key] = $item;
                    $append[] = $copy;
                }

                array_unshift($values, $product[$key]);
            }

            $result = array_merge($result, $append);
        }
    }

    return $result;
}

用法

$input = [
    'arm' => ['A', 'B', 'C'],
    'gender' => ['Female', 'Male'],
    'location' => ['Vancouver', 'Calgary'],
];

print_r(cartesian($input));

将输出所需的笛卡尔积,保留键和值:

Array
(
    [0] => Array
        (
            [arm] => A
            [gender] => Female
            [location] => Vancouver
        )

    [1] => Array
        (
            [arm] => A
            [gender] => Female
            [location] => Calgary
        )

    [2] => Array
        (
            [arm] => A
            [gender] => Male
            [location] => Vancouver
        )

...etc.

以上是如何在保留键值对的同时计算 PHP 关联数组的笛卡尔积?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn