Php 我正在尝试获取字符串中字符的出现次数

Php 我正在尝试获取字符串中字符的出现次数,php,arrays,string,Php,Arrays,String,下面是我尝试的代码,其中count显示不正确。 请帮我找到我不懂逻辑的地方。 我附上代码,我已经尝试到目前为止。 注:-我不打算使用php的更多内置函数,所以我创建了字符串长度函数 error_reporting(E_ALL); $string = "ssddk"; function checkString($addinString, &$stringBK) { if (empty(count($stringBK))) { $stringBK[] = $addi

下面是我尝试的代码,其中count显示不正确。 请帮我找到我不懂逻辑的地方。 我附上代码,我已经尝试到目前为止。 注:-我不打算使用php的更多内置函数,所以我创建了字符串长度函数

error_reporting(E_ALL);
$string = "ssddk";

function checkString($addinString, &$stringBK) {
    if (empty(count($stringBK))) {
        $stringBK[] = $addinString;
        return false;
    }
    foreach ($stringBK as $key => $val) {
        if ($addinString == $val) {
             return true;
        }
    }

    $stringBK[] = $addinString;
    return false;
}

for ($i = 0; $i < checkstrlength($string); $i++) {
    $count = 0;
    for ($j = 0; $j < checkstrlength($string); $j++) {
        if ($string[$i] == $string[$j]) {
            if (checkString($string[$i], $stringBK)) {
                continue 2;
            }

            $count++;
            echo "Column => " . $string[$j] . " for count" .$count . "<br>";
        }
    }
}

function checkstrlength($string) {
    $count = 0;
    for ($i = 0; $string[$i] != ""; $i++) {
        $count++;
    }
    return $count;
}
我期待它作为,
好的,这里有一些东西要看

checkstrlength具有以下循环

 for ($i = 0; $string[$i] != ""; $i++) {
正式地说,我们通常查看字符串中的\0终止字符来终止循环。但在PHP中,一切都是字符串。因此,\0现在是要匹配的字符串,而不是字符匹配。更好的是,我们做一个isset检查来停止循环。因此,代码看起来像:

for ($i = 0; isset($string[$i]); $i++) {
$length = checkstrlength($string);

for ($i = 0; $i < $length; $i++) {
   for ($j = $i; $j < $length; $j++) {
 function checkString($addinString, &$stringBK) {
   foreach ($stringBK as $key => $val) {
     if ($addinString == $val) {
         return true;
     }
   }
   $stringBK[] = $addinString;
   return false;
 }
第二个问题是您没有缓存从checkstrlength获得的结果。去做吧。此外,还可以从$i本身开始内部循环。没有必要从头再来。因此,for循环看起来像:

for ($i = 0; isset($string[$i]); $i++) {
$length = checkstrlength($string);

for ($i = 0; $i < $length; $i++) {
   for ($j = $i; $j < $length; $j++) {
 function checkString($addinString, &$stringBK) {
   foreach ($stringBK as $key => $val) {
     if ($addinString == $val) {
         return true;
     }
   }
   $stringBK[] = $addinString;
   return false;
 }
现在,在嵌套循环中,将其添加到内部循环外部的$stringBK中,因为当字符匹配时,没有必要检查内部循环。这是因为如果访问了某个字符,为什么要初始化内部循环呢。只需在上面进行检查,然后继续搜索和计数。还要注意,在内部循环中有echo语句,这是没有意义的,因为我们还没有完成计数。让我们这样做,并在最后的内部循环外打印它。片段如下:

for ($i = 0; $i < $length; $i++) {
   $count = 0;
   if (checkString($string[$i], $stringBK)) {
      continue;
   }
   for ($j = $i; $j < $length; $j++) {
      if ($string[$i] == $string[$j]) {
         $count++;
      }
   }

  echo "Column => " . $string[$i] . " for count : " .$count,PHP_EOL;
}

最后的代码演示:

我不打算使用php的任何内置函数,所以我创建了字符串长度函数。我已经可以看到空函数和计数函数了。可能有帮助我正在编辑这篇文章谢谢:顺便问一下,checkString做了什么?它会检查字符是否已经找到,这样就不会在下一行迭代中再次计数了。@Sam很高兴我能帮上忙:如果你在寻找更快的方法,