首页 > 解决方案 > 我正在尝试获取字符串中字符的出现次数

问题描述

下面是我尝试过的代码,其中计数显示不正确。请帮助我找到我缺少逻辑的地方。我附上了迄今为止我尝试过的代码。PS注意:-我不打算使用更多内置的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;
}

它给出以下输出,

Column => s for count1
Column => d for count1
Column => k for count1

我期待它,

Column => s for count 2
Column => d for count 2
Column => k for count 1

标签: phparraysstring

解决方案


好的,这里有几件事要看。

  • 具有以下checkstrlength()循环。

     for ($i = 0; $string[$i] != ""; $i++) {
    

    正式地说,我们通常查看\0字符串中的终止字符来终止我们的循环。但在 PHP 中,一切都是字符串。因此,\0现在是要匹配的字符串而不是字符匹配。更好的是,我们进行isset检查以停止我们的循环。所以,代码看起来像:

    for ($i = 0; isset($string[$i]); $i++) {
    
  • 其次是你没有缓存你得到的结果checkstrlength()。去做吧。此外,您可以从$i自身开始内部循环。没有必要从头再来。所以,for循环看起来像:

    $length = checkstrlength($string);
    
    for ($i = 0; $i < $length; $i++) {
       for ($j = $i; $j < $length; $j++) {
    
  • 三 是不需要empty签到count这也减少了内置函数调用。如果找到,您可以简单地循环。如果没有找到,我们无论如何都会添加它。所以它看起来像:checkStringreturn true

     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;
    }
    

最终代码演示: https ://3v4l.org/4dpST


推荐阅读