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

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

整体思路:
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) "华为"
  }
}

你可能感兴趣的:(PHP获取索引数组的笛卡尔积)