我正在做一项作业,了解如何获取以逗号分隔的文本字符串并反转各个单词并以相同的顺序返回单词。
输入示例:
a,my,foo,barn,bazza,foobar
预期输出:
a,ym,oof,nrab,azzab,raboof
这段代码可以做到这一点,但由于某种原因它没有将其作为字符串返回,我不明白。
<?php
function bassAckwards($input)
{
// YOUR CODE HERE
$commas = substr_count($input, ",");
$NumWords = ($commas + 1);
$words = array($input);
for($x=0;$x<$NumWords;$x++)
{
$answer = array(strrev($words[$x]));
$answer = implode(",",$answer);
print $answer;
}
}
?>
function bassAckwards($str){
$words = explode(',', $str);
$reversedWords = array_map('strrev', $words);
return implode(',', $reversedWords);
}
var_dump(bassAckwards('foo,bar,baz')); // string(11) "oof,rab,zab"
使用内置功能,省去一些麻烦。
explode
array_map
& strrev
strrev
对数组的每个元素执行 array_map
(字符串反转)并返回[修改后的]数组。implode
$reversedWords = array();
// Explode by commas
$words = explode(',', $input);
foreach ($word in $words) {
// For each word
// Stack it, reversed, in the new array $reversedWords
$reversedWords[] = strrev($word);
}
// Implode by commas
$output = implode(',', $reversedWords);
print $output;
使用
preg_replace_callback()
允许在匹配时就地反转字符串。 该字符串仅被遍历一次。
代码:(演示)
echo preg_replace_callback(
'/[^,]+/',
fn($m) => strrev($m[0]),
'foo,bar,baz'
);
// oof,rab,zab
作为避免使用
strrev()
的心理练习,您可以编写一个递归脚本。 (演示)
function rreplace($string)
{
return preg_replace_callback(
'/([^,])([^,]*)([^,])/',
fn($m) => $m[3] . rreplace($m[2]) . $m[1],
$string
);
}
echo rreplace('foo,barn,bazza,foobar');
嵌套函数调用相当优雅——这是最新的语法(从 PHP8.1 开始可调用第一类)。 演示
echo implode(
',',
array_map(
strrev(...),
explode(',', $string)
)
);
另一个(不是特别优雅):Demo
echo array_reduce(
explode(',', 'foo,barn,bazza,foobar'),
fn($csv, $v) => $csv . ($csv ? ',' : '') . strrev($v),
''
);