2010-06-04 44 views
8

Câu hỏi này đã được các thành viên khác hỏi/trả lời nhưng trường hợp của tôi hơi khác ..Làm cách nào để đảo ngược các từ trong chuỗi?

Vấn đề: Làm cách nào để đảo ngược các từ trong chuỗi? Bạn có thể sử dụng strpos(), strlen(), substr() nhưng không phải các hàm rất hữu ích khác như explode(), strrev() v.v.

Đây là câu hỏi phỏng vấn cơ bản vì vậy tôi cần chứng minh khả năng thao tác chuỗi .

Ví dụ:

$ string = "Tôi là một cậu bé"

Trả lời:

"Tôi ma một yob"

Dưới đây là giải pháp của tôi đó đã cho tôi 2 ngày (tiếng thở dài) nhưng phải có giải pháp thanh lịch hơn. Mã của tôi trông rất dài ..

Cảm ơn trước!

ý định của tôi:

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 

Code:

<?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

Yêu cầu chúng tôi trả lời câu hỏi phỏng vấn cho bạn? : ( –

+0

FWIW, mã có vẻ ổn với tôi –

+1

@Ian P: Anh ấy đã trả lời rồi. Anh ấy hỏi có cách nào thanh lịch hơn không. – webbiedave

Trả lời

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

Chỉnh sửa: Bạn hỏi cho mỗi từ được đảo ngược, nhưng vẫn còn trong "từ" trật tự. Một cái gì đó như thế này có thể làm việc tốt hơn:

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

Câu hỏi của anh ta/cô ấy không cho phép điều đó! –

+0

Vâng, thấy rằng sau khi tôi trả lời :) –

+0

Nó đã thắng cũng không trả lời đúng. Anh ta muốn đảo ngược từng từ riêng lẻ. – webbiedave

2

Hoan hô! Đọc sai câu hỏi. Ở đây bạn đi (Lưu ý rằng điều này sẽ chia trên tất cả các ranh giới không chữ, không chỉ là không gian Nếu bạn muốn có một nhân vật không được chia theo, chỉ cần thêm nó vào $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; 
} 

Edit: Bây giờ nó là một hàm duy nhất và lưu trữ bộ đệm một cách ngây thơ trong ký hiệu đảo ngược.

Edit2: Bây giờ xử lý ký tự UTF8 (chỉ cần thêm "từ" nhân vật đến $wordChars string) ...

+0

câu hỏi không cho phép sử dụng strrev() – thetaiko

+0

@thetaiko Cảm ơn, tôi đã đọc sai câu hỏi ban đầu. Đã chỉnh sửa trong một giải pháp ... – ircmaxell

+0

Tốt nhất để xử lý UTF-8. Tôi cũng đã thêm một giải pháp nhưng với các chuỗi và số thường. –

1

Tôi tin rằng cách dễ nhất sẽ được chèn chuỗi của bạn trong một mảng sử dụng phát nổ() và bằng cách sử dụng hàm array_reverse(). Tất nhiên bạn sẽ phải xuất ra mảng. Để biết thêm chi tiết về array_reverse() thấy http://php.net/manual/en/function.array-reverse.php

0

Nó có thể được thực hiện theo một cách rất thanh lịch hơn nếu PHP sử dụng cú pháp concatenative :)

{ 
    "" "" 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 Nên được olleh woh rea uoy .... u đã làm toàn bộ chuỗi như đảo ngược – Affan

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

Anh ấy không được phép sử dụng strrev như đã đề cập trong câu hỏi –

0

câu trả lời của tôi là để đếm chiều dài chuỗi, chia các chữ cái thành một mảng và sau đó lặp lại nó. Đây cũng là một cách hay để kiểm tra xem một từ có phải là palindrome hay không. Điều này chỉ có thể được sử dụng cho chuỗi và số thường.

preg_split cũng có thể được thay đổi thành phát nổ().

/** 
* 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); 
} 
Các vấn đề liên quan