php - 我正在尝试获取字符串中字符的出现次数
问题描述
下面是我尝试过的代码,其中计数显示不正确。请帮助我找到我缺少逻辑的地方。我附上了迄今为止我尝试过的代码。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
解决方案
好的,这里有几件事要看。
具有以下
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
。这也减少了内置函数调用。如果找到,您可以简单地循环。如果没有找到,我们无论如何都会添加它。所以它看起来像:checkString
return 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
推荐阅读
- php - 如果不是特定用户,则重定向用户
- ajax - OnDelete Handler 总是触发一个错误的请求
- swift - 使用 JSONDecoder 解码数字 snake_case 键
- python - img2pdf:一页pdf,一张图片?
- iis - DebugDiag Analysis 生成报告的时间过长
- google-api - 如何通过 Google Photos API 检测照片已被修改?
- python - 如何进行摊销计算
- java - Java - SpringBoot + Feign + Eureka(Feign 无法从 Eureka 解析 URL)
- vue.js - 改变数据的值,但数据没有更新
- java - ListView 具有更多字段和来自 firebase 数据库的自定义外观数据