PHPackages                             leinster/twiddle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. leinster/twiddle

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

leinster/twiddle
================

Generates k-combinations. A PHP implementation of Chase's TWIDDLE, https://dl.acm.org/doi/10.1145/362384.362502, transliterated from Matthew Belmonte's C implementation.

v1.0.2(1y ago)02Apache-2.0PHPPHP ^8.2CI passing

Since Dec 31Pushed 1y ago1 watchersCompare

[ Source](https://github.com/leinster/twiddle)[ Packagist](https://packagist.org/packages/leinster/twiddle)[ RSS](/packages/leinster-twiddle/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (3)Dependencies (6)Versions (5)Used By (0)

Leinster\\Twiddle
=================

[](#leinstertwiddle)

Twiddle
=======

[](#twiddle)

A library for generating [k-combinations](https://en.wikipedia.org/wiki/Combination).

This provides a PHP implementation of Phillip J Chase’s TWIDDLE, `Algorithm 382: Combinations of M out of N Objects \[G6\]’, [Communications of the Association for Computing Machinery 13:6:368 (1970)](https://dl.acm.org/doi/10.1145/362384.362502).

See the C implementation by Matthew Belmonte (and original license), [twiddle.c](src/twiddle.c) in the `src` directory. Downloaded from , 2023-02-19. This implementation is largely a transliteration from the C.

Licensed under the [Apache-2.0 license](LICENSE).

Build status
------------

[](#build-status)

[![https://github.com/leinster/twiddle/actions/workflows/php.yml/badge.svg](https://github.com/leinster/twiddle/actions/workflows/php.yml/badge.svg)](https://github.com/leinster/twiddle/actions/workflows/php.yml)

Usage
-----

[](#usage)

```
declare(strict_types=1);

error_reporting(E_ALL ^ E_DEPRECATED);

require __DIR__ . "/vendor/autoload.php";

use Leinster\Twiddle;
```

### Generating combinations from an array

[](#generating-combinations-from-an-array)

Use [SetTwiddler](src/SetTwiddler.php) to generate combinations from an array:

```

$k = 2;
$twiddler = new Twiddle\SetTwiddler($k, [0, 1, 2]);
foreach ($twiddler as $combination) {
    printf("%s\n", json_encode($combination));
}
```

```
[1,2]
[0,2]
[0,1]
```

You can use toArray rather than iterating:

```

$k = 2;
$twiddler = new Twiddle\SetTwiddler($k, ["A", "B", "C"]);
printf("%.0f\n", $twiddler->count());
printf("%s\n", json_encode($twiddler->toArray()));
```

```
3
[["B","C"],["A","C"],["A","B"]]
```

Duplicate values in the input array are treated as distinct, clients should supply unique values if required:

```

$k = 2;
$twiddler = new Twiddle\SetTwiddler($k, [0, 0, 1]);
printf("%s\n", json_encode($twiddler->toArray()));
$twiddler = new Twiddle\SetTwiddler($k, ["A", "B", "B"]);
printf("%s\n", json_encode($twiddler->toArray()));
```

```
[[0,1],[0,1],[0,0]]
[["B","B"],["A","B"],["A","B"]]
```

The `count` method returns ${n \\choose k}$ as a float.

```

$k = 10;
$twiddler = new Twiddle\SetTwiddler($k, range(0, 999));
printf("%.0f\n", $twiddler->count());
printf("%d\n", PHP_INT_MAX);
```

```
263409560461970249875456
9223372036854775807
```

### Generating bit sequences

[](#generating-bit-sequences)

You can use [BitTwiddler](src/BitTwiddler.php) to generate $n$ length arrays containing $k$ ones and $(n - k)$ zeros:

```

$k = 2;
$n = 4;
$twiddler = new Twiddle\BitTwiddler($k, $n);
printf("%.0f\n", $twiddler->count());
foreach ($twiddler as $combination) {
    printf("%s\n", json_encode($combination));
}
```

```
6
[0,0,1,1]
[1,0,0,1]
[0,1,0,1]
[0,1,1,0]
[1,0,1,0]
[1,1,0,0]
```

### Parameter restrictions

[](#parameter-restrictions)

In both cases, and with $n$ the length of `$set` for `SetTwiddler`, we must have $k ∈ \\mathbb{N}^0,\\ n ∈ \\mathbb{N}^+,\\ k ≤ n$.

### Transformers

[](#transformers)

You can use the [transformer functions](src/functions.php) (or another [callable](https://www.php.net/manual/en/language.types.callable.php)) to modify the output from the generators.

```

use function Leinster\Twiddle\Functions\stringTransformer;

$twiddler = new Twiddle\SetTwiddler(
    2,
    str_split("ABCDEFG"),
    stringTransformer()
);
printf("%s\n", json_encode($twiddler->toArray()));
```

```
["FG","AG","BG","CG","DG","EG","EF","AF","BF","CF","DF","DE","AE","BE","CE","CD","AD","BD","BC","AC","AB"]
```

```

use function Leinster\Twiddle\Functions\intTransformer;

$twiddler = new Twiddle\BitTwiddler(3, 5, intTransformer());
printf("%s\n", json_encode($twiddler->toArray()));
```

```
[7,19,11,13,21,25,28,26,22,14]
```

See also
--------

[](#see-also)

 is another PHP implementation.

###  Health Score

29

—

LowBetter than 59% of packages

Maintenance44

Moderate activity, may be stable

Popularity2

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~34 days

Total

3

Last Release

434d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/77bf48fa25ce4e90f6b38c8531feeb4c6c6a27466601611fd0ea07576178644e?d=identicon)[leinster](/maintainers/leinster)

---

Top Contributors

[![leinster](https://avatars.githubusercontent.com/u/24134?v=4)](https://github.com/leinster "leinster (32 commits)")

---

Tags

combinatoricscombinationsk-combinations

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Rector

Code StyleECS

Type Coverage Yes

### Embed Badge

![Health badge](/badges/leinster-twiddle/health.svg)

```
[![Health](https://phpackages.com/badges/leinster-twiddle/health.svg)](https://phpackages.com/packages/leinster-twiddle)
```

###  Alternatives

[markrogoyski/math-php

Math Library for PHP. Features descriptive statistics and regressions; Continuous and discrete probability distributions; Linear algebra with matrices and vectors, Numerical analysis; special mathematical functions; Algebra

2.4k7.1M40](/packages/markrogoyski-math-php)[alphazygma/combinatorics

Math libraries for Combinatorics (Combinations, Permutations, ...).

15192.0k](/packages/alphazygma-combinatorics)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
