在PHP中比较德语专用字母不起作用

时间:2018-07-07 13:21:12

标签: php string encoding utf-8

我已经制定了一种简单的算法来检测句子是否为等距图(单词或短语不带重复字母)。算法非常简单-只是将每个字母相互比较。

<?php
function isIsogram(string $_s) : bool
{
    $_s = mb_strtoupper($_s, 'utf-8');

    $isogram = true;
    for ($i = 0; $i < mb_strlen($_s); $i++) {
        for ($j = $i + 1; $j < mb_strlen($_s) - 1; $j++) {
            if ($_s[$i] == $_s[$j]) {
                $isogram = false;
            }
        }
    }

    return $isogram;
}

这适用于除德语字母以外的所有测试用例:

public function testWorksWithGermanLetters()
{
    $this->assertTrue(isIsogram('Heizölrückstoßabdämpfung'));
}

另一种算法(由别人制作)可以正常工作:

<?php

function isIsogram($input)
{
    $input = preg_split('//u', preg_replace('/-| /', '', mb_strtolower($input)), -1, PREG_SPLIT_NO_EMPTY);
    if(count(array_unique($input)) == count($input))
        return true;
        return false;
}

为什么?

1 个答案:

答案 0 :(得分:1)

这是一个编码问题。一种简单的解决方案是使用mb_substr而不是数组符号。

function isIsogram(string $_s) : bool {
    $_s = mb_strtoupper($_s, 'utf-8');

    for ($i = 0; $i < mb_strlen($_s); $i++) {
        for ($j = $i + 1; $j < mb_strlen($_s); $j++) {
            if (mb_substr($_s, $i, 1) == mb_substr($_s, $j, 1)) {
                return false;
            }
        }
    }

    return true;
}

顺便说一句。如果您找到了第一个匹配的字符串,并且还错过了最后一个字符(-1是错误的),则可能会中断循环。