drupol / phpermutations
生成器和迭代器,排列和组合。
Requires
- php: >= 7.1.3
Requires (Dev)
- drupol/php-conventions: ^1.7.1
- phpunit/php-code-coverage: ^4 || ^5
- phpunit/phpunit: ^6 || ^7
README
PHPermutations
PHP迭代器和生成器,以高效的方式生成排列和组合。
最初,该库仅用于生成排列和组合。
最后,我添加了其他迭代器和生成器,例如
- 斐波那契数
- 完美数
- 质数
- 数字的乘积
- 数组旋转
- 数组遍历
- 排列
- 组合
介绍
我一直对数字及其周围的一切都感到着迷...换句话说,数学。
该库最初是为了在 PHPartition 中使用而编写的,然后在这里进行了扩展。
其主要用途是生成排列和组合,而不会耗尽内存,这要归功于 PHP生成器 和 迭代器。
与其他组合库的不同之处在于,您可以使用一个额外的参数 'length',这允许您计算特定大小的排列和组合。另一个显著的区别是,您的输入数组可以包含任何类型的对象(整数、数组、字符串或对象),该库仍然可以无任何麻烦地继续工作。
要求
- PHP >= 7.1.3
如何使用
通过以下方式将此库包含到您的项目中
composer require drupol/phpermutations
假设您想找到长度为 3 的数字列表 [1, 2, 3, 4, 5] 的所有排列
// Create the object $permutations = new \drupol\phpermutations\Generators\Permutations([1,2,3,4,5], 3); // Use a foreach loop. foreach ($permutations->generator() as $permutation) {// do stuff} // Or get the whole array at once. $permutations->toArray();
除了非常少数的组件之外,大多数组件都有相同的参数。
由于尚未编写每个组件的文档,我建议您查看测试以了解如何使用它们。
组合
在数学中,组合是从集合中选择项目的一种方式,其中(与排列不同)选择顺序不重要。-- 维基百科
一句话:当顺序不重要时,它就是一个组合。
示例
假设我们有一组水果
$list = ['Apple', 'Pear', 'Banana', 'Orange']
并且我们想找到长度为 3
的组合,结果将是
['Apple', 'Pear', 'Banana']
['Apple', 'Pear', 'Orange']
['Apple', 'Banana', 'Orange']
['Pear', 'Banana', 'Orange']
排列
在数学中,排列的概念与将集合的所有成员排列成某种顺序或顺序的行为相关,如果集合已经排序,则重新排列(重新排序)其元素,这个过程称为排列。这些与组合不同,组合是忽略顺序的集合成员的选择。-- 维基百科
一句话:当顺序重要时,它就是一个排列。
示例
假设我们有一组水果
['Apple', 'Pear', 'Banana', 'Orange']
并且我们想要找到长度为:3
的排列,结果将是
['Apple', 'Pear', 'Banana']
['梨', '苹果', '香蕉']
['苹果', '香蕉', '梨']
['香蕉', '苹果', '梨']
['梨', '香蕉', '苹果']
['香蕉', '梨', '苹果']
['Apple', 'Pear', 'Orange']
['梨', '苹果', '橙子']
['苹果', '橙子', '梨']
['橙子', '苹果', '梨']
['梨', '橙子', '苹果']
['橙子', '梨', '苹果']
['Apple', 'Banana', 'Orange']
['香蕉', '苹果', '橙子']
['苹果', '橙子', '香蕉']
['橙子', '苹果', '香蕉']
['香蕉', '橙子', '苹果']
['橙子', '香蕉', '苹果']
['Pear', 'Banana', 'Orange']
['香蕉', '梨', '橙子']
['梨', '橙子', '香蕉']
['橙子', '梨', '香蕉']
['香蕉', '橙子', '梨']
['橙子', '香蕉', '梨']
数组 [1, 2, 3, 4, 5] 的长度为 3 的排列如下,请耐心等待,所有组合长度为 3 的排列之和。
测试
每个生成器和迭代器都使用相同的输入值进行测试。我尽量使用测试来尽可能地完整。每次修改源代码时,GitHub 的持续集成服务会测试代码与这些测试的兼容性,这样你就可以知道你引入的更改是否有效。
贡献
请随时通过发送 Github pull request 来为此库做出贡献。我反应很快哦 :-)