Foreach循环只循环一次

时间:2018-04-03 15:59:54

标签: php foreach

我正在尝试遍历$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>

2 个答案:

答案 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

我只是想表明另一种方法。

干杯!