继续检查并在foreach if语句中返回更多匹配项

时间:2018-11-13 17:51:13

标签: php function loops if-statement foreach

我有一个本质上要通过CSV文件查找在用户个人资料中与用户设置匹配的行的功能。反正...

问题是我正在检查每辆汽车(行)的CSV文件,然后在汽车与用户设置匹配的情况下返回值。问题是,如果用户具有以下设置:

  • 本田思域1993年至2007年
  • Jeep Liberty 2002年至2018年

并且CSV具有以下记录:

  • 本田思域1996
  • 本田思域2004
  • Jeep Liberty 2010

...当前,if语句将仅返回本田思域的第一次迭代,然后返回吉普自由。因此,它永远不知道移至if语句的下一个/后续匹配项。

    private function find_vehicle($cars,$make,$model,$yr_start,$yr_end){
        $tmp = explode("|", $model);
        $model = $tmp[1];
        echo 'Looking for: ' . $make . ' '. $model . ' between: '.$yr_start .'-'.$yr_end . '<br>';
        foreach ( $cars as $car ) {
            if ($make == $car[1] && $model == $car[2]){
                if ($car[4] >= $yr_start && $car[4] <= $yr_end){
                    return $car;
                }
            }
        }
        return 0;
    }

如何调整foreach和/或if语句,以使它不会在Make / Model / Year的第一个版本中停止...而是在{ {1}}每场比赛都是新的return

否则,当前输出为:

  • 本田思域1996
  • Jeep Liberty 2010

但是我还需要它还返回其他匹配的本田思域2004

2 个答案:

答案 0 :(得分:1)

您可以将函数转换为生成器(请参见PHP生成器概述https://secure.php.net/manual/en/language.generators.overview.php):

private function find_vehicle($cars,$make,$model,$yr_start,$yr_end) {
    $tmp = explode("|", $model);
    $model = $tmp[1];
    echo 'Looking for: ' . $make . ' '. $model . ' between: '.$yr_start .'-'.$yr_end . '<br>';
    foreach ( $cars as $car ) {
        if ($make == $car[1] && $model == $car[2]){
            if ($car[4] >= $yr_start && $car[4] <= $yr_end){
                yield $car;
            }
        }
    }
}

并这样称呼它:

foreach (find_vehicle($cars, $make, $model, $yr_start, $yr_end) as $car) {
    // Do something with $car
}

答案 1 :(得分:0)

想法是为匹配的汽车构建一个数组,并在函数末尾返回此列表(代码中的一些注释)...

private function find_vehicle($cars,$make,$model,$yr_start,$yr_end){
    $tmp = explode("|", $model);
    $model = $tmp[1];
    // List of matching records
    $matching = [];
    // echo 'Looking for: ' . $make . ' '. $model . ' between: '.$yr_start .'-'.$yr_end . '<br>';
    foreach ( $cars as $car ) {
        if ($make == $car[1] && $model == $car[2]){
            if ($car[4] >= $yr_start && $car[4] <= $yr_end){
                // Add new entry to matching list (rather than return the first one)
                $matching[] = $car;
            }
        }
    }
    return $matching;
}

这使用$matching来保存列表,并使用

添加到列表中
$matching[] = $car;

最后将其传回,如果什么也没找到,它将是一个空列表

return $matching;

您还可以看到我已经注释掉echo-它对调试很有用,但是除非必须这样做,否则请避免使用既处理数据又产生输出的方法。