当前位置:首页 > 编程技术 > PHP编程 > 正文内容

PHP多数组组合-颜色尺码大小

曾经2年前 (2022-10-08)PHP编程575

抽象一下需求:

在构建某个对象时,它拥有多个属性,每个属性拥有多个可选的值,需要穷举出每个属性不同的选择组合构建出的不同对象,比如:

输入参数:

$arr = [
    'Name' => ['Jack', 'Lily', 'Martin'],
    'Age' => ['18', '12'],
    'Gender' => ['male', 'female'],
    'Address' => ['Alexander', 'Huston', 'NewYork'],
    ];

从每个属性中取一个值,根据排列组合计算知道可以得到 36 个不同的人。

期望结果:

篇幅原因,中间省略掉。

array (
  0 =>
  array (
    'Name' => 'Jack',
    'Age' => '18',
    'Gender' => 'male',
    'Address' => 'Alexander',
  ),
  1 =>
  array (
    'Name' => 'Jack',
    'Age' => '18',
    'Gender' => 'male',
    'Address' => 'Huston',
  ),

  ...

  34 =>
  array (
    'Name' => 'Martin',
    'Age' => '12',
    'Gender' => 'female',
    'Address' => 'Huston',
  ),
  35 =>
  array (
    'Name' => 'Martin',
    'Age' => '12',
    'Gender' => 'female',
    'Address' => 'NewYork',
  ),)


实现代码:

/**
 * 排列组合
 * @param $arr
 * @return array
 */
 function pac($arr){

    if (empty($arr)) {
        return [];
    }

    $n = count($arr);   // 维度数量
    $count = 1;         // 结果总数
    $size = [];         // 每个属性的可选值个数
    $visit = [];        // 每个属性当前访问到的位置(下标)
    $keyIndex = [];     // 保存每个属性的key
    $res = [];          // 保存结果

    // 初始化
    $i = 0;
    foreach ($arr as $key => $values) {
        $size[$i] = count($values);
        $visit[$i] = 0;
        $count *= count($values);
        $keyIndex[$i] = $key;
        $i ++;
    }

    $m = 0;
    $temp = [];
    while (true) {

        for ( $i = 0; $i < $n; $i++ ) {
            // 取当前位置的下一个位置记录到最终的数组中
            $temp[$m][$i] = $visit[$i] + 1;
        }

        $m ++;

        for ( $i = $n - 1; $i >= 0; $i-- ) {
            // 取的是可选值的最后一个值时,重置位置记录,下一个组合从0位置开始
            if ($visit[$i] == $size[$i] - 1) {
                $visit[$i] = 0;
            } else {
            // 当前属性未取完
                break;
            }
        }

        // 当所有属性的值都取完了,经过最后一次$i--, $i 值变为 -1,循环完成
        if ($i < 0) {
            break;
        }
        // 位置后移
        $visit[$i] ++;

    }

    for ($i = 0; $i < $count; $i ++) {
        for ($j = 0; $j < $n; $j ++) {
            $res[$i][$keyIndex[$j]] = $arr[$keyIndex[$j]][$temp[$i][$j]-1];
        }
    }

    return $res;
}

如果需求是想要从多个元素中取n个出来,得到多种不同的结果,如果可选元素集合为['a', 'b','c'],n为2,这样传值:

$arr = [
    ['a', 'b','c'],
    ['a', 'b','c'],];

得到的结果(部分):

array (
  0 =>
  array (
    0 => 'a',
    1 => 'a',
  ),
  1 =>
  array (
    0 => 'a',
    1 => 'b',
  ),

  ...

  7 =>
  array (
    0 => 'c',
    1 => 'b',
  ),
  8 =>
  array (
    0 => 'c',
    1 => 'c',
  ),)


扫描二维码推送至手机访问。

版权声明:本文由珍惜发布,如需转载请注明出处。

本文链接:https://www.zp68.com/article/41.html

分享给朋友:

“PHP多数组组合-颜色尺码大小” 的相关文章

最详细的PHP flush()与ob_flush()的区别详解

buffer ---- flush()buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一...

PHP中刷新输出缓冲

PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文件的时候,你每...

php 使用curl_multi_init批量请求

抓取多个URL地址是Web开发中常见的需求,使用PHP的curl库可以简化这个过程。本文将详细介绍如何使用PHP的curl库同时请求多个URL地址,并提供具体的代码案例和注释。curl库介绍curl是一个常用的开源网络传输工具,可以通过各种协议(如HTTP、FTP、TELNET)在不同的平台上进行数...

PHP 多线程 curl_multi_init 的使用 PK curl_init 看看那个更快

php中可以通过CURL处理HTTP请求,其中curl_init()是单线程模式,如果需要对事务处理走多线程模式,那么就需要用到curl_multi_init()函数。本案例用来测试大并发的情况下 curl_multi_init() 到底比 curl_init() 快多少。话不多少,直接上...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。