2010-06-04 90 views
8

这个问题已经被其他成员询问/回答过,但是我的情况有点不同..如何反转字符串中的单词?

问题:如何反转字符串中的单词?你可以使用strpos(),strlen(),substr()但不是其他非常有用的函数,如explode(),strrev()等。 。

例子:

$字符串= “我是男孩”

答:

“我麻yob”

下面是我的解决方案,我花了2天(叹息)但那里得到更优雅的解决方案。我的代码看起来很长..

在此先感谢!

我的意图:

1. get number of word 
2. based on number of word count, grab each word and store into array 
3. loop through array and output each word in reverse order 

代码:

<?php 

$str = "I am a boy"; 

echo reverse_word($str) . "\n"; 

function reverse_word($input) { 
    //first find how many words in the string based on whitespace 
    $num_ws = 0; 
    $p = 0; 
    while(strpos($input, " ", $p) !== false) { 
     $num_ws ++; 
     $p = strpos($input, ' ', $p) + 1; 
    } 

    echo "num ws is $num_ws\n"; 

    //now start grabbing word and store into array 
    $p = 0; 
    for($i=0; $i<$num_ws + 1; $i++) { 
     $ws_index = strpos($input, " ", $p); 
     //if no more ws, grab the rest 
     if($ws_index === false) { 
      $word = substr($input, $p); 
     } 
     else { 
      $length = $ws_index - $p; 
      $word = substr($input, $p, $length); 
     } 
     $result[] = $word; 
     $p = $ws_index + 1; //move onto first char of next word 
    } 

    print_r($result); 
    //append reversed words 
    $str = ''; 
    for($i=0; $i<count($result); $i++) { 
     $str .= reverse($result[$i]) . " "; 
    } 
    return $str; 
} 

function reverse($str) { 
    $a = 0; 
    $b = strlen($str)-1; 
    while($a < $b) { 
     swap($str, $a, $b); 
     $a ++; 
     $b --; 
    } 
    return $str; 
} 

function swap(&$str, $i1, $i2) { 
    $tmp = $str[$i1]; 
    $str[$i1] = $str[$i2]; 
    $str[$i2] = $tmp; 
} 

?> 
+3

请求我们为您解答面试问题? :( – 2010-06-04 20:28:25

+0

FWIW,代码对我来说看起来不错 – 2010-06-04 20:30:26

+1

@Ian P:他已经回答了,他问是否有更优雅的方式去做 – webbiedave 2010-06-04 20:33:50

回答

17
$string = "I am a boy"; 

$reversed = ""; 
$tmp = ""; 
for($i = 0; $i < strlen($string); $i++) { 
    if($string[$i] == " ") { 
     $reversed .= $tmp . " "; 
     $tmp = ""; 
     continue; 
    } 
    $tmp = $string[$i] . $tmp;  
} 
$reversed .= $tmp; 

print $reversed . PHP_EOL; 
>> I ma a yob 
-1

http://php.net/strrev

编辑:你问了被逆转的每个单词,但仍处于 “字” 的命令。像这样的东西可能会更好地工作:

$string = "I am a boy!"; 
$array = explode(" ", $string); 
foreach ($array as &$word) { 
    $word = strrev($word); 
} 
$rev_string = implode(" ", $array); 
+1

他/她的问题是不允许的! – 2010-06-04 20:29:19

+0

是啊,看到我回答后:) – 2010-06-04 20:30:35

+0

它赢了也不会产生正确的答案。他想要逐个反转每个单词。 – webbiedave 2010-06-04 20:31:45

2

哎呦!错读了这个问题。在这里你去(请注意,这将分裂的所有非字母的界限,而不仅仅是空间,如果你想有一个字符不是在被分割,只需将其添加到$wordChars):

function revWords($string) { 
    //We need to find word boundries 
    $wordChars = 'abcdefghijklmnopqrstuvwxyz'; 
    $buffer = ''; 
    $return = ''; 
    $len = strlen($string); 
    $i = 0; 
    while ($i < $len) { 
     $chr = $string[$i]; 
     if (($chr & 0xC0) == 0xC0) { 
      //UTF8 Characer! 
      if (($chr & 0xF0) == 0xF0) { 
       //4 Byte Sequence 
       $chr .= substr($string, $i + 1, 3); 
       $i += 3; 
      } elseif (($chr & 0xE0) == 0xE0) { 
       //3 Byte Sequence 
       $chr .= substr($string, $i + 1, 2); 
       $i += 2; 
      } else { 
       //2 Byte Sequence 
       $i++; 
       $chr .= $string[$i]; 
      } 
     } 
     if (stripos($wordChars, $chr) !== false) { 
      $buffer = $chr . $buffer; 
     } else { 
      $return .= $buffer . $chr; 
      $buffer = ''; 
     } 
     $i++; 
    } 
    return $return . $buffer; 
} 

编辑:现在它是一个单一的功能,并且天真地以反转的符号存储缓冲区。

EDIT2:现在处理UTF8字符(刚加入“字”字的$wordChars字符串)...

+0

问题不允许使用strrev() – thetaiko 2010-06-04 20:42:44

+0

@thetaiko谢谢,我最初错误地阅读了这个问题。在解决方案中编辑... – ircmaxell 2010-06-04 20:50:28

+0

好处理UTF-8。我还添加了一个解决方案,但使用常规字符串和数字。 – 2015-06-09 02:28:03

1

我认为最简单的方法是使用爆炸插入您的字符串数组中的()和比使用array_reverse()函数。当然,你将不得不输出数组。有关array_reverse更多详细资料()见http://php.net/manual/en/function.array-reverse.php

0

它可能以一种更优雅的方式完成了在PHP中使用拼接语法:)

{ 
    "" "" 3 roll 
    { 
     dup " " == 
      { . . "" } 
      { swp . } 
     ifelse } 
    foreach . 
} "reverse" function 

"I am a boy" reverse echo // Prints "I ma a yob" 
0
$str = "Hello how are you"; 

$teststr = explode(" ",$str); 

for($i=count($teststr)-1;$i>=0;$i--){ 
echo $teststr[$i]." "; 
} 


Output : you are how hello 
+0

O/P应该是olleh woh rea uoy ....你做了整个字符串作为反转 – Affan 2015-08-19 04:41:45

0
<?php 
    // Reversed string and Number 
    // For Example : 
     $str = "hello world. This is john duvey"; 
     $number = 123456789; 
     $newStr = strrev($str); 
     $newBum = strrev($number); 

     echo $newStr; 
     echo "<br />"; 
     echo $newBum; 

OUTPUT : 
first : yevud nhoj si sihT .dlrow olleh 
second: 987654321 
+1

他不允许使用所述的strrev – 2013-11-29 10:50:07

0

我的回答是计数字符串长度,将这些字母拆分成一个数组,然后向后循环。这也是检查单词是否是回文的好方法。这只能用于常规字符串和数字。

preg_split也可以更改为explode()。

/** 
* Code snippet to reverse a string (LM) 
*/ 

$words = array('one', 'only', 'apple', 'jobs'); 

foreach ($words as $d) { 
    $strlen = strlen($d); 
    $splits = preg_split('//', $d, -1, PREG_SPLIT_NO_EMPTY); 

    for ($i = $strlen; $i >= 0; $i=$i-1) { 
     @$reverse .= $splits[$i]; 
    } 

    echo "Regular: {$d}".PHP_EOL; 
    echo "Reverse: {$reverse}".PHP_EOL; 
    echo "-----".PHP_EOL; 
    unset($reverse); 
}