美文网首页
PHP获取索引数组的笛卡尔积

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

作者: 老衲灬 | 来源:发表于2020-02-22 16:45 被阅读0次

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

整体思路:
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获取索引数组的笛卡尔积

    需求【商品规格的笛卡尔积同理】:根据几项不同指标项中的不同指标,获取其相互组合的笛卡尔积,返回的是带有原数组索引的...

  • php基础精粹

    PHP php数组 php数组之索引数组初始化 PHP数组之索引数组赋值 PHP数组之访问索引数组内容 PHP数组...

  • iOS 求笛卡尔积写法

    求任意数组笛卡尔积 OC Swift 写法 求这三个数组的笛卡尔积 ,结果应该是 有27个。 具体实现: 结果: ...

  • 十月十五

    PHP数组之索引数组初始化 php数组,根据索引值的不同分为两种:索引数组、关联数组。 索引和关联两个词都是针对数...

  • 优雅的写双重循环

    用 itertools 的笛卡尔积 product 返回一个生成器,能 yield 出传入数组形成的笛卡尔积。pr...

  • PHP基础 —— 数组

    数组 PHP中不需要指定数组大小 索引数组 索引为整数的数组 关联数组 索引值为字符串的数组,使用字符串作为索引 ...

  • PHP编程指南(六)数组

    索引数组 定义 方式一: 方式二: 获取指定索引位置上的值: 遍历索引数组 索引数组的长度 通过count()函数...

  • laravel 数组【1.索引数组2.关联数组】

    PHP 索引数组 有两种创建索引数组的方法: 索引是自动分配的(索引从 0 开始): 或者也可以手动分配索引: 下...

  • 2019-07-21

    在 PHP 中,有三种数组类型:索引数组 - 带有数字索引的数组可以通过$cars[index]查找。关联数组 -...

  • PHP | 数组 知识梳理 与 运用实例

    1. 数组的定义 创建一个空数组,并把创建的空数组赋值给变量$arr: PHP有两种数组:索引数组、关联数组。索引...

网友评论

      本文标题:PHP获取索引数组的笛卡尔积

      本文链接:https://www.haomeiwen.com/subject/jwwlqhtx.html