我正在尝试遍历$names
中的所有名称并使用正则表达式进行转换。转换很好,但我无法找到循环遍历每个名称的方法。
目前,只返回一个值:"姓名:COOPE,Sebastian"
<!DOCTYPE html>
<html>
<head>
<title>PHP Arrays</title>
</head>
<body>
<h1>PHP Arrays</h1>
<?php
$names = array("Sebastian Coope", "Andrew Craig", "Prof Karl Tuyls", "Dr Ullrich Hustadt", "Dr Michele Zito");
foreach($names as $name){
function rewriteText($match){
$firstName = $match[2];
$surname = $match[3];
return strtoupper($surname).', '.$firstName;
}
$altered = preg_replace_callback(
"/(Mr|Ms|Mrs|Dr|Prof)?\s*(\w+)\s+(\w+)/",
"rewriteText",
$name);
echo "Name: $altered<br>\n";
}
?>
</body>
</html>
答案 0 :(得分:6)
致命错误:无法在第13行的/path/to/file.php中重新声明rewriteText()(之前在/path/to/file.php:13中声明)
只需在foreach
循环
$names = array("Sebastian Coope", "Andrew Craig", "Prof Karl Tuyls", "Dr Ullrich Hustadt", "Dr Michele Zito");
function rewriteText($match){
$firstName = $match[2];
$surname = $match[3];
return strtoupper($surname).', '.$firstName;
}
foreach($names as $name) {
$altered = preg_replace_callback(
"/(Mr|Ms|Mrs|Dr|Prof)?\s*(\w+)\s+(\w+)/",
"rewriteText",
$name);
echo "Name: $altered<br>\n";
}
答案 1 :(得分:0)
另一种选择,类似于@Felippe Duarte
$rewriteText = function ($match){
$firstName = $match[2];
$surname = $match[3];
return strtoupper($surname).', '.$firstName;
};
foreach($names as $name){
$altered = preg_replace_callback(
"/(Mr|Ms|Mrs|Dr|Prof)?\s*(\w+)\s+(\w+)/",
$rewriteText,
$name);
echo "Name: $altered<br>\n";
}
通常你会将匿名函数放在preg_replace_callback
中,但是当它在循环中时,我喜欢在外面进行。
Closures的另一个优点是它们可以覆盖自己,所以你不必检查是否存在某个函数,但是出于性能原因,我尽量不在循环中覆盖它们。
再次感谢@Felippe Duarte
我只是想表明另一种方法。
干杯!