我有一个包含空格分隔单词的字符串。
我想颠倒每个单词中的字母而不颠倒单词的顺序。
我希望
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
对于任何人对使用合理的本机 PHP 函数有人为限制
我将提供一个仅利用
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
,然后变为 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;
在处理连续的非空白字符时,将它们存储为临时字符串变量——将每个新遇到的字符添加到变量前面可以有效地反转单词。每当遇到空格时,将临时变量与分隔空格一起连接到结果字符串;然后清空临时变量以便可以再次使用。循环解析后,将任何剩余的临时字符串附加到结果中。
function reverseWords($str) {
$word="";
$newstr="";
for($i=0;$i<strlen($str);$i++) {
$word=$str[$i].$word;
if($str[$i]==" "||$i==strlen($str)-1) {
$newstr=$newstr." ".$word;
$word="";
}
}
return $newstr;
}
// Example usage
$inputString = "Hello World";
$reversedWords = reverseWords($inputString);
echo "Original String: $inputString\n";
echo "Reversed Words: $reversedWords\n";
这是使用单循环对字符串中的单词进行反转的最简单方法