【发布时间】:2009-07-23 06:32:01
【问题描述】:
我有一个包含空格分隔单词的字符串。
我想颠倒每个单词中的字母而不颠倒单词的顺序。
我希望my string 成为ym gnirts。
【问题讨论】:
我有一个包含空格分隔单词的字符串。
我想颠倒每个单词中的字母而不颠倒单词的顺序。
我希望my string 成为ym gnirts。
【问题讨论】:
这应该可行:
$words = explode(' ', $string);
$words = array_map('strrev', $words);
echo implode(' ', $words);
或者作为单行:
echo implode(' ', array_map('strrev', explode(' ', $string)));
【讨论】:
echo implode(' ', array_reverse(explode(' ', strrev('my string'))));
这比在分解原始字符串后反转数组的每个字符串要快得多。
【讨论】:
功能化:
<?php
function flipit($string){
return implode(' ',array_map('strrev',explode(' ',$string)));
}
echo flipit('my string'); //ym gnirts
?>
【讨论】:
这应该可以解决问题:
function reverse_words($input) {
$rev_words = [];
$words = split(" ", $input);
foreach($words as $word) {
$rev_words[] = strrev($word);
}
return join(" ", $rev_words);
}
【讨论】:
split() 是 POSIX Regex 扩展的一部分,在 PHP 5.3.0 中已弃用,取而代之的是 Perl-Compatible Regex (PCRE)。但是你不需要正则表达式,你只需要explode()。
我愿意:
$string = "my string";
$reverse_string = "";
// Get each word
$words = explode(' ', $string);
foreach($words as $word)
{
// Reverse the word, add a space
$reverse_string .= strrev($word) . ' ';
}
// remove the last inserted space
$reverse_string = substr($reverse_string, 0, strlen($reverse_string) - 1);
echo $reverse_string;
// result: ym gnirts
【讨论】:
对于任何拥有contrived limitations on the use of sensible native PHP functions的人
我将提供一个 sn-p,它仅利用 for()、strlen() 和 strpos()。我的 sn-p 假设输入字符串将:
代码:(Demo)
$string = "I am a boy like desired and expected";
for (
$offset = 0, $length = strlen($string);
$offset < $length;
++$offset
) {
$offset += $string[$offset] === ' ';
for (
$swaps = 0, $wordEnd = (strpos($string, ' ', $offset) ?: $length) - 1;
$offset < $wordEnd;
++$swaps, ++$offset, --$wordEnd
) {
[$string[$wordEnd], $string[$offset]] = [$string[$offset], $string[$wordEnd]];
}
$offset += $swaps;
}
echo $string;
输出:
I ma a yob ekil derised dna detcepxe
这种嵌套循环方法只对输入文本中的每个单词调用一次strpos()。它的工作原理是将第一个字母与最后一个字母交换,然后(根据需要多次)它从前端和末端“进入”一个位置,并交换下一对字母。例如,like 变为 eikl,然后变为 ekil。
字符“交换”语法是调用“array destructuring”(来自 PHP7.1)。在= 的右侧,要交换的变量被声明为一个二元素数组。在= 的左侧,再次使用了二元素数组语法,但这一次来自右侧的值将写入左侧的变量中。这种技术避免了声明临时变量的需要。
在进入嵌套的for() 块之前,调用$offset += $string[$offset] === ' '; 作为优化以避免不必要的strpos() 调用分隔空格(非单词字符)。当嵌套的 for() 块解析时,偏移量会根据执行的交换次数 ($offset += $swaps;) 增加 - 这会使偏移量整数向前移动并防止无限循环。
构建此 sn-p 的重点不是简洁或可读性,而是尽量减少总函数调用和计算时间,同时避免临时反转子字符串和连接。 strlen() 只调用一次,strpos() 对输入文本中的每个单词调用一次。
这个 sn-p 绝对是一个纯粹的学术努力,我永远不会把它放在专业应用程序中。强加的人为限制只会在工作面试等发展挑战中遇到。
维护一个临时的反向子字符串并有条件地连接提供了一个更具可读性的 sn-p,没有迭代函数调用,如 @thetaiko 所示。
代码:(Demo)
$string = "I am a boy like desired and expected";
$result = '';
$reversedWord = '';
$length = strlen($string);
for ($offset = 0; $offset < $length; ++$offset) {
if ($string[$offset] === ' ') {
$result .= $reversedWord . ' ';
$reversedWord = '';
} else {
$reversedWord = $string[$offset] . $reversedWord;
}
}
$result .= $reversedWord;
echo $string;
在处理连续的非空白字符时,将它们存储为一个临时字符串变量——将每个新遇到的字符添加到变量中可以有效地反转单词。每当遇到空格时,将临时变量与分隔空格一起连接到结果字符串;然后清空临时变量,以便再次使用它。循环解析后,将任何剩余的临时字符串附加到结果中。
【讨论】: