反转字符串中每个单词的字母

问题描述 投票:0回答:7

我有一个包含空格分隔单词的字符串。

我想颠倒每个单词中的字母而不颠倒单词的顺序。

我希望

my string
成为
ym gnirts

php string reverse
7个回答
6
投票

这应该有效:

$words = explode(' ', $string);
$words = array_map('strrev', $words);
echo implode(' ', $words);

或者作为一句台词:

echo implode(' ', array_map('strrev', explode(' ', $string)));

2
投票
echo implode(' ', array_reverse(explode(' ', strrev('my string'))));

这比分解原始字符串后反转数组中的每个字符串要快得多。


1
投票

功能化:

<?php

function flipit($string){
    return implode(' ',array_map('strrev',explode(' ',$string)));
}

echo flipit('my string'); //ym gnirts

?>

0
投票

这应该可以解决问题:

function reverse_words($input) {
    $rev_words = [];
    $words = split(" ", $input);
    foreach($words as $word) {
        $rev_words[] = strrev($word);
    }
    return join(" ", $rev_words);
}

0
投票

我会做:

$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

0
投票

对于任何人对使用合理的本机 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;

在处理连续的非空白字符时,将它们存储为临时字符串变量——将每个新遇到的字符添加到变量前面可以有效地反转单词。每当遇到空格时,将临时变量与分隔空格一起连接到结果字符串;然后清空临时变量以便可以再次使用。循环解析后,将任何剩余的临时字符串附加到结果中。


0
投票
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";

这是使用单循环对字符串中的单词进行反转的最简单方法

© www.soinside.com 2019 - 2024. All rights reserved.