0

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

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

我想my string成为ym gnirts

4

6 回答 6

6

这应该有效:

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

或作为单行:

echo implode(' ', array_map('strrev', explode(' ', $string)));
于 2009-07-23T06:33:49.997 回答
2
echo implode(' ', array_reverse(explode(' ', strrev('my string'))));

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

于 2009-07-23T06:34:27.950 回答
1

功能化:

<?php

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

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

?>
于 2009-07-23T06:41:48.140 回答
0

这应该可以解决问题:

function reverse_words($input) {
    $rev_words = [];
    $words = split(" ", $input);
    foreach($words as $word) {
        $rev_words[] = strrev($word);
    }
    return join(" ", $rev_words);
}
于 2009-07-23T06:37:34.933 回答
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
于 2009-07-23T06:38:35.477 回答
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变成eiklthen 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;

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

于 2022-01-14T22:03:35.767 回答