需求【商品规格的笛卡尔积同理】:
根据几项不同指标项中的不同指标,获取其相互组合的笛卡尔积,返回的是带有原数组索引的笛卡尔积结果,且数组值的数据类型保持不变。
整体思路:
1、通过第一个数组拼装出结果集的数据结构。
2、然后依次处理结果集与其它数组的笛卡尔积。
详细代码示例:
$params = [
'gender' => ['男', '女'],
'city' => [["北京"], ["上海", "深圳"]],
'brand' => ["苹果", "华为"],
];
$result = cartesianMultiIndexArray($params);
var_dump($result);
/**
* 多个索引数组笛卡尔积
* @param array $params
* @return array
*/
function cartesianMultiIndexArray($params)
{
$result = [];
// 将第一个数组转为结果所需数据结构
foreach ($params as $key => $val) {
foreach ($val as $k => $v) {
$result[] = [$key => $v];
}
break;
}
array_shift($params);
if (empty($params)) {
return $result;
}
foreach ($params as $key => $val) {
// 依次与其他数组得到笛卡尔积
$result = cartesianNextArrayToResult($result, $val, $key);
}
return $result;
}
/**
* 获取前两个数组笛卡尔积的结果与下一个数组的笛卡尔积
* @param array $resultVal
* @param array $nextArr
* @param string $keyName
* @return array
*/
function cartesianNextArrayToResult($resultVal, $nextArr, $keyName)
{
$result = [];
foreach ($resultVal as $val) {
foreach ($nextArr as $v) {
$temp = $val;
$temp[$keyName] = $v;
$result[] = $temp;
}
}
return $result;
}
结果如下:
array(8) {
[0]=>
array(3) {
["gender"]=>
string(3) "男"
["city"]=>
array(1) {
[0]=>
string(6) "北京"
}
["brand"]=>
string(6) "苹果"
}
[1]=>
array(3) {
["gender"]=>
string(3) "男"
["city"]=>
array(1) {
[0]=>
string(6) "北京"
}
["brand"]=>
string(6) "华为"
}
[2]=>
array(3) {
["gender"]=>
string(3) "男"
["city"]=>
array(2) {
[0]=>
string(6) "上海"
[1]=>
string(6) "深圳"
}
["brand"]=>
string(6) "苹果"
}
[3]=>
array(3) {
["gender"]=>
string(3) "男"
["city"]=>
array(2) {
[0]=>
string(6) "上海"
[1]=>
string(6) "深圳"
}
["brand"]=>
string(6) "华为"
}
[4]=>
array(3) {
["gender"]=>
string(3) "女"
["city"]=>
array(1) {
[0]=>
string(6) "北京"
}
["brand"]=>
string(6) "苹果"
}
[5]=>
array(3) {
["gender"]=>
string(3) "女"
["city"]=>
array(1) {
[0]=>
string(6) "北京"
}
["brand"]=>
string(6) "华为"
}
[6]=>
array(3) {
["gender"]=>
string(3) "女"
["city"]=>
array(2) {
[0]=>
string(6) "上海"
[1]=>
string(6) "深圳"
}
["brand"]=>
string(6) "苹果"
}
[7]=>
array(3) {
["gender"]=>
string(3) "女"
["city"]=>
array(2) {
[0]=>
string(6) "上海"
[1]=>
string(6) "深圳"
}
["brand"]=>
string(6) "华为"
}
}