我有一个本质上要通过CSV文件查找在用户个人资料中与用户设置匹配的行的功能。反正...
问题是我正在检查每辆汽车(行)的CSV文件,然后在汽车与用户设置匹配的情况下返回值。问题是,如果用户具有以下设置:
并且CSV具有以下记录:
...当前,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
?
否则,当前输出为:
但是我还需要它还返回其他匹配的本田思域2004
答案 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
-它对调试很有用,但是除非必须这样做,否则请避免使用既处理数据又产生输出的方法。