代码之家  ›  专栏  ›  技术社区  ›  Garconis

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

  •  0
  • Garconis  · 技术社区  · 7 年前

    我有一个功能,基本上是通过一个CSV文件,并找到符合用户配置文件中设置的行。无论如何

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

    • 本田思域1993年至2007年

    CSV有以下记录:

    • 本田思域1996
    • 本田思域2004
    • 吉普自由2010

    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 和/或 声明,这样它就不会停止在一个品牌/型号/年份的第一个版本。。。但它将继续 return $car ?

    否则,当前输出为:

    • 吉普自由2010

    但我也需要它来归还另一辆本田思域2004

    2 回复  |  直到 7 年前
        1
  •  1
  •   Ron Dobley    7 年前

    您可以将函数转换为生成器(请参见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
    }
    
        2
  •  0
  •   Nigel Ren    7 年前

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

    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