drupol/phpermutations

生成器和迭代器,排列和组合。

1.4.0 2020-05-11 07:42 UTC

This package is auto-updated.

Last update: 2024-09-15 07:45:52 UTC


README

Latest Stable Version GitHub stars Total Downloads GitHub Workflow Status Scrutinizer code quality Code Coverage License Donate!

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 来为此库做出贡献。我反应很快哦 :-)