Этот вопрос уже спрошен/отвечен другими участниками, но мой случай несколько отличается..
Проблема: Как инвертировать слова в строке? Можно использовать ремни для правки бритв (), strlen (), substr (), но не другие очень полезные функции те, которые взрываются (), strrev () и т.д.
Это - в основном вопрос об интервью, таким образом, я должен продемонстрировать способность управлять строками.
Пример:
$string = "Я - мальчик"
Ответ:
"Я мама 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;
}
?>
$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
Редактировать: Вы просили, чтобы каждое слово было перевернуто, но по-прежнему в порядке «слов». Что-то вроде этого могло бы сработать лучше:
$string = "I am a boy!";
$array = explode(" ", $string);
foreach ($array as &$word) {
$word = strrev($word);
}
$rev_string = implode(" ", $array);
Ой! Неправильно прочитал вопрос. Вот и все (обратите внимание, что это будет разделено на все небуквенные границы, а не только на пробел. Если вы хотите, чтобы символ не разделялся, просто добавьте его в $ 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
) ...