<?php
/**
* 任取N个不同单字节字符的所有组合,把组合结果存放到数组中,不用系统函数
* 算法思路:其实就是排列组合的数学原理。这里把字符进行逐个追加产生不同的组合,
* 而新加入的字符又是在之前组合的基础上再次组合而成.
* @author nswe
*/
/**
* 混合串处理
* @param string $sourceStr 原字符串
* @return array 组合结果
*/
function composite($sourceStr)
{
$resultArray= array();
$strLength = strlen($sourceStr);
for($i= 0;$i < $strLength;$i++)
{
attachItem($sourceStr[$i],$resultArray);
}
return $resultArray;
}
/**
* 追加合成项到结合中
* @param char $attachChar 追加组合的字符
* @param array &$resultArray 集合引用
*/
function attachItem($attachChar,&$resultArray)
{
$resultCount= count($resultArray);
if($resultCount== 0)
{
$resultArray[] =$attachChar;
}
else
{
for($i= 0;$i < $resultCount;$i++)
{
$subStr= $resultArray[$i];
//把增加的$attachChar字符拼接到结尾 (注:此处用到$i键,来重写$resultArray中已经存在的临时值,而不必在最后unset临时值,提高了效率)
$resultArray[$i] =$subStr.$attachChar;
//把增加的$attachChar字符拼接到开头
$resultArray[] =$attachChar.$subStr;
//把增加的$attachChar字符拼接到已有的字符中间缝隙
$stringLength= strlen($subStr);
for($j= 1;$j < $stringLength;$j++)
{
$cutResult= cutString($subStr,$j);
$resultArray[] =$cutResult[0].$attachChar.$cutResult[1];
}
}
}
}
/**
* 切割字符串
* @param string $sourceString 待切割的字符串
* @param int $index 切割字符串位置
* @return array 切割两部分的字符串
*/
function cutString($sourceString,$index)
{
$frontString= '';
$backString = '';
$isCut = false;
for($i= 0;$i < strlen($sourceString);$i++)
{
if($i== $index)
{
$isCut= true;
}
if($isCut== true)
{
$backString.= $sourceString[$i];
}
else
{
$frontString.= $sourceString[$i];
}
}
return array($frontString,$backString);
}
//调用执行代码
$sourceStr = 'abcd';
$resultArray= composite($sourceStr);
print_r($resultArray);