任取字符的组合

<?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);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值