php 数组中的元素进行排列组合

需求背景:计算出数组['A','B','C','D']各种排列组合,希望得到的是数据如下图

直接上代码:
 

 private function finish_combination($array, &$groupResult = [], $splite = ','){$result = [];$finish_result = [];$this->diffArrayItems($array, $result);foreach ($result as $value) {$items = $this->array_combination($value, $splite);if (!isset($groupResult[count($value)])) $groupResult[count($value)] = [];$groupResult[count($value)] = array_merge($groupResult[count($value)], $items);$finish_result = array_merge($finish_result, $items);}return $finish_result;}
// 不同数组的值进行排列组合例如:['A','B','C'],排列如何出所有的可能性private function array_combination($arr, $splite = ','){$len = count($arr);if ($len == 1) {return $arr;}$result = array();for ($i = 0; $i < $len; $i++) {$tmp_arr = $arr;unset($tmp_arr[$i]);$tmp_arr = array_values($tmp_arr);$tmp_result = $this->array_combination($tmp_arr, $splite);foreach ($tmp_result as $val) {$val .= $splite . $arr[$i];$result[] = $val;}}return $result;}private function getCombinations($input, $length, $start = 0, $current = array(), &$result = array()){if (count($current) === $length) {$result[] = $current;return;}for ($i = $start; $i < count($input); $i++) {$current[] = $input[$i];$this->getCombinations($input, $length, $i + 1, $current, $result);array_pop($current);}}
// 获取不同个数的数组例如['A'],['B'],['C'],['D'],['A''B'],['A''c']......['A', 'B', 'C', 'D']private function diffArrayItems($input, &$result){for ($i = 1; $i <= count($input); $i++) {$this->getCombinations($input, $i, 0, array(), $result);}}//直接调用
$result = $this->finish_combination(['A', 'B', 'C', 'D']);
var_dump($result);

// 排列组合了所有的数据后,一般情况下,我们都想着验证下个数是否正确,
例如:
取 1 个元素的排列组合数为 P(4, 1) = 4! / (4 - 1)! = 4! / 3! = 4
取 2 个元素的排列组合数为 P(4, 2) = 4! / (4 - 2)! = 4! / 2! = 12
取 3 个元素的排列组合数为 P(4, 3) = 4! / (4 - 3)! = 4! / 1! = 24
取 4 个元素的排列组合数为 P(4, 4) = 4! / (4 - 4)! = 4! / 0! = 24
下面就需要另外一个函数

//此方法需要开启GMP扩展
private function nP($n){$sum = 0;for ($i = 1; $i <= $n; $i++) {$sum += gmp_fact($n) / gmp_fact($n - $i);}return intval($sum);}
// 然后直接调用
echo $this->nP(count('A', 'B', 'C', 'D']));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/326610.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++输入函数总结

1、cin 2、cin.get 3、cin.getline 4、getline 5、gets 6、getchar 1、cin 可以接受单个字符和字符串&#xff0c;但遇空格,"TAB","回车"结束&#xff01;&#xff01;&#xff01; 若不跳过空白字符&#xff0c;使用 noskipws 流控制。 使用方法如…

基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答

前言 过去半年&#xff0c;随着ChatGPT的火爆&#xff0c;直接带火了整个LLM这个方向&#xff0c;然LLM毕竟更多是基于过去的经验数据预训练而来&#xff0c;没法获取最新的知识&#xff0c;以及各企业私有的知识 为了获取最新的知识&#xff0c;ChatGPT plus版集成了bing搜索…

作业三详解

作业3&#xff1a; 在作业1的基础上&#xff0c;整合修改、删除功能&#xff0c;可实现如下功能 1.进入新增页面&#xff0c;页面填入新增数据&#xff0c;提交表单&#xff0c;然后跳转到查询列表页面&#xff0c;列表页面显示所有记录&#xff08;多一条新增的数据&#xff…

QQ邮件发送(PHP的Laravel)

1. 开启 QQ 邮箱的 SMTP 支持 2.里面会一个类似于密码之类&#xff08;复制一下&#xff09; 3.然后再 .env文件里面配置一下 MAIL_DRIVERsmtp —— 使用支持 ESMTP 的 SMTP 服务器发送邮件&#xff1b; MAIL_HOSTsmtp.qq.com —— QQ 邮箱的 SMTP 服务器地址&#xff0c;必…

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理&#xff08;图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波&#xff09; 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外&#xff0c;为我们了解未知领域提供了新的途径。红外又可以根据波段范围&#xff0c;分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同&#xff0c;但所产…

第34期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

springboot基础

一 springboot 1 spring 的缺点 在spring boot出现以前&#xff0c;使用spring框架的程序员是这样配置web应用环境的&#xff0c;需要大量的xml配置。下图展示了在xml配置的时代和SpringBoot的配置量的差别。 随着web项目集成软件的不断增多&#xff0c;xml配置也不断的增多&…

PyQT 多进程

在PyQt中&#xff0c;图形化界面&#xff08;GUI&#xff09;是运行在主线程中的&#xff0c;而多进程是在独立的进程中执行的。默认情况下&#xff0c;多进程之间是无法直接共享图形化界面的。 然而&#xff0c;有几种方法可以在多进程中与PyQt的图形化界面进行通信&#xff…

vue3中使用elementplus中的el-tree-select,自定义显示名称label

<el-tree-select v-model"addPval" node-key"id" :data"menulists" :render-after-expand"false" :props"menuProps" /> <el-divider />let menuProps {//自定义labellabel: (data: { name: any; }) > {ret…

Beauty algorithm(六)大眼

前几篇主要介绍了唇妆、腮红、眼影、眉形渲染,它们都有一个共同点,关键点只需要检测一次,并且在获得目标区域融合渲染时,只是对像素点加权操作,处理速度快。而对于美颜,如大眼、缩鼻、缩下巴等操作,会产生局部形变,造成关键点移位。因此每次缩放后都要重新检测关键点,…

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …