PHP获取索引数组的笛卡尔积

本文介绍如何使用PHP获取多个索引数组的笛卡尔积,具体步骤包括建立初始结果集,并逐个与其他数组进行笛卡尔积运算,保持数组的原始数据类型和索引。文中提供了一个详细的代码示例来展示实现过程。
摘要由CSDN通过智能技术生成

需求【商品规格的笛卡尔积同理】:
根据几项不同指标项中的不同指标,获取其相互组合的笛卡尔积,返回的是带有原数组索引的笛卡尔积结果,且数组值的数据类型保持不变。

整体思路:
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) "华为"
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值