Php 如何计算一系列字符的笛卡尔幂?

Php 如何计算一系列字符的笛卡尔幂?,php,string,range,cartesian-product,Php,String,Range,Cartesian Product,我想做一个函数,它能够使用a-z,0-9生成字母和可选数字的列表 $output = array(); foreach(range('a','z') as $i) { foreach(range('a','z') as $j) { foreach(range('a','z') as $k) { $output[] =$i.$j.$k; } } } 谢谢 例如: myfunction($include, $length

我想做一个函数,它能够使用a-z,0-9生成字母和可选数字的列表

$output = array();
foreach(range('a','z') as $i) {
    foreach(range('a','z') as $j) { 
        foreach(range('a','z') as $k) { 
            $output[] =$i.$j.$k;
        }
    }
}
谢谢

例如:

 myfunction($include, $length)
用法如下:

 myfunction('a..z,0..9', 3);
输出:

000
001
...
aaa
aab
...
zzz

输出将包含字母、数字和数字的所有可能组合。

有关生成所有可能组合的代码,请参见此答案:

您只需添加
$length
参数来限制组合大小。

$number=范围(0,9);
$number= range(0, 9);
 $letters = range('a', 'z');
$array= array_merge($number, $letters);
//print_r($array);

for($a=0;$a<count($array);$a++){
    for($b=0;$b<count($array);$b++){
        for($c=0;$c<count($array);$c++){
                echo $array[$a].$array[$b].$array[$c]."<br>";
        }
    }
}
$letters=范围('a','z'); $array=array\u merge($number,$letters); //打印(数组); 对于($a=0;$a登台) 首先,使用以下函数将字符串(如
“0..9”
)扩展为
“0123456789”

它处理任意数量的可扩展模式,并注意保持它们在源字符串中的位置,例如

expand_pattern('abc0..4def5..9')
将返回“abc01234def56789”

一次计算结果 现在我们可以轻松地进行此展开,下面是一个函数,该函数在给定允许的字符字符串和长度的情况下计算笛卡尔积:

function cartesian($pattern, $length) {
    $choices = strlen($pattern);
    $indexes = array_fill(0, $length, 0);
    $results = array();
    $resets = 0;

    while ($resets != $length) {
        $result = '';
        for ($i = 0; $i < $length; ++$i) {
            $result .= $pattern[$indexes[$i]];
        }
        $results[] = $result;

        $resets = 0;
        for ($i = $length - 1; $i >= 0 && ++$indexes[$i] == $choices; --$i) {
            $indexes[$i] = 0;
            ++$resets;
        }
    }

    return $results;
}
(我将扩展长度限制为2,以便输出不会爆炸)

动态生成结果 由于结果集可能非常大(它随着
$length
呈指数增长),一次生成所有结果可能会被禁止。在这种情况下,可以重写代码,以便依次返回每个值(迭代器样式),这在PHP 5.5中变得非常容易,因为:

笛卡尔函数($pattern,$length){
$choices=strlen($pattern);
$index=数组填充(0,$length,0);
$resets=0;
while($resets!=$length){
$result='';
对于($i=0;$i<$length;++$i){
$result.=$pattern[$index[$i]];
}
产生$result;
$resets=0;
对于($i=$length-1;$i>=0&&++$index[$i]==$choices;--$i){
$index[$i]=0;
++美元重置;
}
}
}

您可以使用递归函数 假设您的意思是它可以是任意级别的深度,您可以使用递归函数生成排列数组,例如:

/** 
 * take the range of characters, and generate an array of all permutations
 *
 * @param array $range      range of characters to itterate over
 * @param array $array      input array - operated on by reference
 * @param int $depth        how many chars to put in the resultant array should be
 * @param int $currentDepth internal variable to track how nested the current call is
 * @param string $prefix    internal variable to know what to prefix the current string with
* @return array             permutations
*/
function foo($range, &$array, $depth = 1, $currentDepth = 0, $prefix = "") {
    $start = !$currentDepth;
    $currentDepth++;

    if ($currentDepth > $depth) {
        return;
    }   

    foreach($range as $char) {
        if ($currentDepth === $depth) {
            $array[] = $prefix . $char;
            continue;
        }   

        foo($range, $array, $depth, $currentDepth, $prefix . $char);
    }   

    if ($start) {
        return $array;
    }
使用上述函数,初始化返回变量并调用它:

$return = array();
echo implode(foo(range('a', 'z'), $return, 3), "\n");
您的输出将是从aaa到zzz的所有三个字符组合:

aaa
aab
...
zzy
zzz
数值参数决定函数的递归程度:

$return = array();
echo implode(foo(range('a', 'z'), $return, 1), "\n");
a
b
c
...

.

你能更具体地说明你想要完成什么吗?你真的想标记为“PHP4”吗?PHP4,PHP5任何代码都可以。为了将来的参考,您在这里尝试的是生成一组字符的名称。添加了一些细节,您还需要一个方便的符号来描述这组字符。哦…您更新了您的问题…这段代码使所有可能的组合从0到z…谢谢,但原始问题仍然有选项al长度。这和我以前的一样,只是它合并了我没有想到的范围!:P
$return = array();
echo implode(foo(range('a', 'z'), $return, 3), "\n");
aaa
aab
...
zzy
zzz
$return = array();
echo implode(foo(range('a', 'z'), $return, 1), "\n");
a
b
c
...