Как отменить слова в строке?

Этот вопрос уже задан / ответил другими участниками, но мой случай немного отличается.

Проблема: как отменить слова в строке? Вы можете использовать strpos (), strlen (), substr (), но не другие очень полезные функции, такие как explode (), strrev () и т. Д.

Это в основном вопрос интервью, поэтому мне нужно продемонстрировать способность манипулировать строками.

Пример:

$ string = "Я мальчик"

Ответ:

«Я ма-йо»

Ниже мое решение, которое заняло у меня 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; } ?> 

 $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 

Упс! Не читайте вопрос. Здесь вы идете (обратите внимание, что это будет разделено на все небуквенные границы, а не только на пробел. Если вы хотите, чтобы символ не был разделен, просто добавьте его в $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 (просто добавьте символы «word» в строку $wordChars ) …

Я считаю, что самый простой способ – вставить строку в массив с помощью функции explode () и использовать функцию array_reverse (). Конечно, вам придется выводить массив. Для получения дополнительной информации о array_reverse () см. http://php.net/manual/en/function.array-reverse.php

Это могло бы быть сделано намного шире, если PHP использовал конкатенативный синтаксис 🙂

 { "" "" 3 roll { dup " " == { . . "" } { swp . } ifelse } foreach . } "reverse" function "I am a boy" reverse echo // Prints "I ma a yob" 
 $str = "Hello how are you"; $teststr = explode(" ",$str); for($i=count($teststr)-1;$i>=0;$i--){ echo $teststr[$i]." "; } Output : you are how hello 
  <?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 

Мой ответ состоит в том, чтобы подсчитать длину строки, разделить буквы на массив и затем, зацитировать его назад. Это также хороший способ проверить, является ли слово палиндром. Это можно использовать только для регулярной строки и чисел.

preg_split можно изменить, чтобы взорвать ().

 /** * 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); } с /** * 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); } 

http://php.net/strrev

Изменить: вы просили изменить каждое слово, но все равно в «слове». Что-то вроде этого может работать лучше:

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