【问题标题】:Foreach loop only looping onceForeach 循环只循环一次
【发布时间】:2018-04-03 15:59:54
【问题描述】:

我正在尝试遍历$names 中的所有名称并使用正则表达式对其进行转换。转换很好,但我找不到遍历每个名​​称的方法。

目前只返回一个值:“姓名:COOPE,塞巴斯蒂安”

<!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>

【问题讨论】:

  • error_reporting(E_ALL); ini_set('display_errors', '1'); 将显示 致命错误:无法重新声明 rewriteText()(之前声明过

标签: php foreach


【解决方案1】:

致命错误:无法在第 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";
}

【讨论】:

  • 或者把它包裹在if(!function_exists('rewriteText')) { function rewriteText(...){...} }里面
  • 也不需要循环,它可以在数组上工作:3v4l.org/Ftujt
【解决方案2】:

另一个选项,类似于@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 中,但当它处于循环中时,我喜欢在外面做。

闭包的另一个优点是它们可以覆盖自己的,因此您不必检查函数是否存在,但出于性能原因,我尽量不在循环中覆盖它们。

再次感谢@Felippe Duarte

我只是想展示另一种方法。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 2013-11-28
    • 1970-01-01
    • 2015-09-28
    • 2016-01-09
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多