在关联数组中保留键的同时查找笛卡尔积
考虑如下关联数组:
$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。
算法通过归纳法证明(假设没有错误):
假设结果已经包含第一个的笛卡尔积N-1个子数组,可以扩展如下:
代码实现
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中文网其他相关文章!