Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从随机字母字符串中提取子字符串_Php_String - Fatal编程技术网

Php 从随机字母字符串中提取子字符串

Php 从随机字母字符串中提取子字符串,php,string,Php,String,我有一个字符串,它在性质上是随机的,例如“CBLBTTCCBB”。我的目标是统计字符串CTLBT在字符串CBLBTTCCBB中的出现次数。不允许重复用于检查的字母。例如,一旦形成CTLBT,下一次迭代的剩余随机字母将是BCCB 这个场景是,我们有一张刮刮卡,用户可以在其中赢得字母,形成单词CTLBT。根据用户的记录,他赢得的字母是一个字符串CBLBTTCCBB,该字符串是根据购买刮刮卡从左到右排序的 我曾想过使用strpos,但它似乎不合适,因为它使用了较大字符串的子字符串的精确排列 如何解决这

我有一个字符串,它在性质上是随机的,例如“CBLBTTCCBB”。我的目标是统计字符串
CTLBT
在字符串
CBLBTTCCBB
中的出现次数。不允许重复用于检查的字母。例如,一旦形成
CTLBT
,下一次迭代的剩余随机字母将是
BCCB

这个场景是,我们有一张刮刮卡,用户可以在其中赢得字母,形成单词
CTLBT
。根据用户的记录,他赢得的字母是一个字符串
CBLBTTCCBB
,该字符串是根据购买刮刮卡从左到右排序的

我曾想过使用strpos,但它似乎不合适,因为它使用了较大字符串的子字符串的精确排列

如何解决这个问题有什么想法吗

谢谢

注:
问题不是重复的,因为在给定链接中发布的解决方案是不同的
substr\u count
从假定字符串以正确的顺序形成子字符串的字符串中计算子字符串的出现次数。

如果我理解正确,我会这样做(带有显示结果的打印):

由于您希望计算组合,而不考虑顺序,最小字母数将是用户获胜的次数,如果没有一个字母,则为0


我让您将其转换为一个函数,并清理您不希望的打印行;)

那么您可以使用preg_replace代替strpos,然后:

function rand_substr_count($haystack, $needle)
{
    $result = $haystack;

    for($i=0; $i<strlen($needle); $i++) {
        $result = preg_replace('/'.$needle[$i].'/', '', $result, 1);
    }

    if (strlen($haystack) - strlen($result) == strlen($needle)) {
        return 1 + rand_substr_count($result, $needle);
    } else {
        return 0;
    }
}

echo rand_substr_count("CBLBTTCCBB", "CTLBT");
函数rand\u substr\u count($haystack,$pinder)
{
$result=$haystack;

对于($i=0;$iDid你试过了吗?@DevDonkey到目前为止,我仍在收集我对这件事的想法。我曾想过将整个字符串循环,但我想这将是低效的。@VladimirGilevich尝试了substr_count,但它没有考虑草堆的随机性。我的目标是获得由随机数形成的目标字符串的出现次数字符串。@Jhn所以您想检查在
CBLBTTCCBB
的每个顺序组合中
CTLBT
发生多少次?@Jhn在答案中又添加了一个变量:)谢谢@Tensibai!我会努力实现你建议的更好的方法option@jhn让我知道,我现在的时间很短,我会有更多的时间在以后的比赛中改进它day@Jhn答案改进,如果有不清楚的地方请告诉我。希望知道搜索次数(如果有人赢了两次或更多次)@Tensibai感谢您的提醒!-将代码移动到函数中-现在很容易使用计数。递归函数的很好使用:)我可以问一下为什么单字母替换是
preg\u replace
而不是
str\u replace
(IIRC它更快,但我可能错了)
str\u replace()
将替换所有当前的字符,但是使用
preg\u replace()
我们只能替换第一个找到的字符。因此-就这一细微差别而言
preg\u replace()
在这里更好。哦,的确,再次阅读文档,我发现str\u replace中的$count是一个占位符,不是一个限制。抱歉;)
Letters needed are:
Array
(
    [0] => C
    [1] => T
    [2] => L
    [3] => B
)

Count of each letter divided by their appearance times:
Array
(
    [C] => 5
    [T] => 2
    [L] => 2
    [B] => 4
)

Wins: 2
function rand_substr_count($haystack, $needle)
{
    $result = $haystack;

    for($i=0; $i<strlen($needle); $i++) {
        $result = preg_replace('/'.$needle[$i].'/', '', $result, 1);
    }

    if (strlen($haystack) - strlen($result) == strlen($needle)) {
        return 1 + rand_substr_count($result, $needle);
    } else {
        return 0;
    }
}

echo rand_substr_count("CBLBTTCCBB", "CTLBT");