检查字符串是否按字母顺序排列

Way*_*rer 21 php string

这似乎很明显,但我找不到办法做到这一点.
我认为甚至还有一个常规的PHP函数可以做到这一点,但即便是这样,在经过1.5小时的密集Google搜索之后,它仍然保持隐藏状态.

我想要的是

  • 将字符串作为输入的函数.
  • 检查该字符串的字母顺序序列超过3个字符的次数:
  • 如果找到超过3的序列,则返回true.

"youlookgreatbcdetoday" =>其中有"bcde" ...所以必须返回true
"youlookgreatklmtoday" =>只有"klm"...所以必须返回false
"youlookgreattoday" =>没有按字母顺序排列的序列在其中,所以返回false


可能的用例

  • 密码强度检查器
  • 文字游戏
  • ...

免责声明:我希望我已经有一些代码可以告诉你,但我还没有任何东西.
我唯一想到的就是将数组拆分成一个数组并在数组上做一些魔术......但即便如此,我也被卡住了.

希望你们中的一个能救我:)

irc*_*ell 17

所以,让我们从一个使用循环和计数器的简单实现开始(仅用于增加):

function hasOrderedCharactersForward($string, $num = 4) {
    $len = strlen($string);
    $count = 0;
    $last = 0;
    for ($i = 0; $i < $len; $i++) {
        $current = ord($string[$i]);
        if ($current == $last + 1) {
            $count++;
            if ($count >= $num) {
                return true;
            }
        } else {
            $count = 1;
        }
        $last = $current;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

那么它是怎样工作的?基本上,它循环遍历,并检查ord字符的(ascii数字)是否比之前的字符多一个.如果是这样,它会增加计数参数.否则,它将其设置为1(因为我们已经处理了该字符).然后,如果$count更多或等于所请求的数量,我们知道我们找到了一个序列,并且可以返回...

那么,现在让我们检查两个方向:

function hasOrderedCharacters($string, $num = 4) {
    $len = strlen($string);
    $count = 0;
    $dir = 1;
    $last = 0;
    for ($i = 0; $i < $len; $i++) {
        $current = ord($string[$i]);
        if ($count == 1 && $current == $last - 1) {
            $count++;
            $dir = -1;
            if ($count >= $num) {
                return true;
            }
        } elseif ($current == $last + $dir) {
            $count++;
            if ($count >= $num) {
                return true;
            }
        } else {
            $count = 1;
            $dir = 1;
        }
        $last = $current;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

现在,它会为返回true abcddcba...

现在,这是一个更简单的解决方案:

function hasOrderedCharactersForward($string, $num = 4) {
    $len = strlen($string) + 1;
    $array = array_map(
        function($m) use (&$len) {
            return ord($m[0]) + $len--;
        }, 
        str_split($string, 1)
    );
    $str = implode('_', $array);
    $regex = '#(^|_)(\d+)' . str_repeat('_\2', $num - 1) . '(_|$)#';
    return (bool) preg_match($regex, $str);
}
Run Code Online (Sandbox Code Playgroud)

你去吧 我们使用的属性是,如果我们为每个位置添加一个递减的数字,连续的序列将显示为相同的数字.而这正是它的工作原理.

这里适用于两个方向的理论相同:

function hasOrderedCharacters($string, $num = 4) {
    $i = 0;
    $j = strlen($string);
    $str = implode('', array_map(function($m) use (&$i, &$j) {
        return chr((ord($m[0]) + $j--) % 256) . chr((ord($m[0]) + $i++) % 256);
    }, str_split($string, 1)));
    return preg_match('#(.)(.\1){' . ($num - 1) . '}#', $str);
}
Run Code Online (Sandbox Code Playgroud)