我有一个包含空格分隔单词的字符串。
我想颠倒每个单词中的字母而不颠倒单词的顺序。
我想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);
}
我会做:
$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
我将提供一个仅利用for()
、strlen()
和的片段strpos()
。我的片段假定输入字符串将:
代码:(演示)
$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
then ekil
。
字符“交换”语法称为“数组解构”(来自 PHP7.1)。在右侧=
,要交换的变量被声明为一个二元素数组。在左侧=
,再次使用二元素数组语法,但这一次右侧的值将写入左侧的变量中。这种技术避免了声明临时变量的需要。
在进入嵌套for()
块之前,$offset += $string[$offset] === ' ';
调用作为优化以避免strpos()
对分隔空间(非单词字符)的不必要调用。当嵌套for()
块解析时,偏移量会根据执行的交换次数增加($offset += $swaps;
)——这使偏移量整数向前移动并防止无限循环。
构建此代码段的重点不是简洁或可读性,而是尽量减少总函数调用和计算时间,同时避免临时反转子字符串和连接。 strlen()
只调用一次,并且strpos()
对输入文本中的每个单词调用一次。
这个片段绝对是一个纯粹的学术努力,我永远不会把它放在专业的应用程序中。强加的人为限制只会在工作面试等发展挑战中遇到。
维护一个临时的反向子字符串并有条件地连接提供了一个更具可读性的片段,没有迭代函数调用,如@thetaiko 所示。
代码:(演示)
$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;
在处理连续的非空白字符时,将它们存储为一个临时字符串变量——将每个新遇到的字符添加到变量中可以有效地反转单词。每当遇到空格时,将临时变量与分隔空格一起连接到结果字符串;然后清空临时变量,以便再次使用它。循环解析后,将任何剩余的临时字符串附加到结果中。