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

如何在保留键的同时生成关联数组的笛卡尔积?

Barbara Streisand
发布: 2024-12-25 10:39:11
原创
758 人浏览过

How to Generate the Cartesian Product of an Associative Array While Preserving Keys?

在关联数组中保留键的同时查找笛卡尔积

考虑如下关联数组:

$input = array(
    'arm' => array('A', 'B', 'C'),
    'gender' => array('Female', 'Male'),
    'location' => array('Vancouver', 'Calgary'),
);
登录后复制

目标是找到该数组的笛卡尔积,同时保留原始数组关联键。所需的输出将是:

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'
    ),
    ...
)
登录后复制

算法原理

假设输入数组有 N 个子数组 ($input),每个子数组都有 Cn 项,其中 n是它的索引。第 n 个子数组的第 i 项称为 Vn,i。

算法通过归纳法证明(假设没有错误):

  1. 对于 N = 1,笛卡尔Product 是一个简单的一维数组。
  2. 假设结果已经包含第一个的笛卡尔积N-1个子数组,可以扩展如下:

    • Add KN => VN,1 到当前结果中的每个项目。
    • 对于第 N 个输入子数组 (2 添加该项目的副本; VN,m.

代码实现

function cartesian($input) {
    $result = array();

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

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

            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;
}
登录后复制

用法

$output = cartesian($input);
print_r($output);
登录后复制

此代码将输出所需的笛卡尔积,同时保留原始值关联键。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板