bentools / string-combinations
一个简单、内存占用低的函数,用于从一系列字符中生成所有字符串组合。
Requires
- php: >=7.4
- bentools/cartesian-product: ^1.1
Requires (Dev)
- phpunit/phpunit: ^8.0|^9.0
- satooshi/php-coveralls: @stable
- squizlabs/php_codesniffer: @stable
- symfony/var-dumper: ^3.2
This package is auto-updated.
Last update: 2024-09-11 09:52:18 UTC
README
字符串组合
一个简单、内存占用低的函数,用于从一系列字符中生成所有字符串组合。
安装
需要 PHP 7.4+。
composer require bentools/string-combinations
用法
我想获取所有包含字母 a
、b
、c
的组合。
require_once __DIR__ . '/vendor/autoload.php'; use function BenTools\StringCombinations\string_combinations; foreach (string_combinations('abc') as $combination) { // Can also be string_combinations(['a', 'b', 'c']) echo $combination . PHP_EOL; }
输出
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
abc
aca
acb
acc
baa
bab
bac
bba
bbb
bbc
bca
bcb
bcc
caa
cab
cac
cba
cbb
cbc
cca
ccb
ccc
数组输出
将所有组合输出到数组中。
var_dump(string_combinations('abc')->asArray());
组合计数
返回可能组合的数量。
var_dump(count(string_combinations('abc'))); // 39
指定最小长度和最大长度
foreach (string_combinations('abc', $min = 2, $max = 2) as $combination) { echo $combination . PHP_EOL; }
输出
aa
ab
ac
ba
bb
bc
ca
cb
cc
使用数组作为第一个参数,以及一个分隔符
foreach (string_combinations(['woof', 'meow', 'roar'], 2, 3, '-') as $combination) { echo $combination . PHP_EOL; }
输出
woof-woof
woof-meow
woof-roar
meow-woof
meow-meow
meow-roar
roar-woof
roar-meow
roar-roar
woof-woof-woof
woof-woof-meow
woof-woof-roar
woof-meow-woof
woof-meow-meow
woof-meow-roar
woof-roar-woof
woof-roar-meow
woof-roar-roar
meow-woof-woof
meow-woof-meow
meow-woof-roar
meow-meow-woof
meow-meow-meow
meow-meow-roar
meow-roar-woof
meow-roar-meow
meow-roar-roar
roar-woof-woof
roar-woof-meow
roar-woof-roar
roar-meow-woof
roar-meow-meow
roar-meow-roar
roar-roar-woof
roar-roar-meow
roar-roar-roar
无重复
使用 withoutDuplicates()
方法,你可以避免生成包含相同字母的字符串。
$combinations = string_combinations('abc'); var_dump(count($combinations)); // 39 print_r($combinations->asArray());
数组 ( [0] => a [1] => b [2] => c [3] => aa [4] => ab [5] => ac [6] => ba [7] => bb [8] => bc [9] => ca [10] => cb [11] => cc [12] => aaa [13] => aab [14] => aac [15] => aba [16] => abb [17] => abc [18] => aca [19] => acb [20] => acc [21] => baa [22] => bab [23] => bac [24] => bba [25] => bbb [26] => bbc [27] => bca [28] => bcb [29] => bcc [30] => caa [31] => cab [32] => cac [33] => cba [34] => cbb [35] => cbc [36] => cca [37] => ccb [38] => ccc )
$combinations = $combinations->withoutDuplicates(); var_dump(count($combinations)); // 15 print_r($combinations->asArray());
数组 ( [0] => a [1] => b [2] => c [3] => ab [4] => ac [5] => ba [6] => bc [7] => ca [8] => cb [9] => abc [10] => acb [11] => bac [12] => bca [13] => cab [14] => cba )
性能考虑
因为它使用 生成器 来生成所有可能的组合,所以你可以遍历成千上万的可能性而不会丢失任何 MB。
在我的 Core i7 个人电脑上执行
require_once __DIR__ . '/vendor/autoload.php'; use function BenTools\StringCombinations\string_combinations; $start = microtime(true); $combinations = string_combinations('abcd1234'); foreach ($combinations as $c => $combination) { continue; } $end = microtime(true); printf( 'Generated %d combinations in %ss - Memory usage: %sMB / Peak usage: %sMB' . PHP_EOL, ++$c, round($end - $start, 3), round(memory_get_usage(true) / 1024 / 1024), round(memory_get_peak_usage(true) / 1024 / 1024) );
输出
生成了 19173960 组合,耗时 5.579 秒 - 内存使用:2MB / 峰值使用:2MB
测试
./vendor/bin/phpunit