Продолжайте проверять и возвращать больше совпадений в выражении foreach if - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть функция, которая, по сути, просматривает файл CSV и находит строки, которые соответствуют настройкам пользователя в их профиле. Во всяком случае ...

Проблема в том, что я проверяю файл CSV для каждого автомобиля (строки), а затем возвращаю значение, если автомобиль соответствует настройкам пользователя. Проблема в том, если у пользователя есть настройка для следующего:

  • Honda Civic с 1993 по 2007
  • Jeep Liberty с 2002 по 2018

И CSV имеет записи:

  • Honda Civic 1996
  • Honda Civic 2004
  • Jeep Liberty 2010

... в настоящее время оператор if возвращает только первую итерацию Honda Civic, а затем возвращает Jeep Liberty. Так что он никогда не знает, как перейти к следующему / последующему совпадению оператора 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, чтобы он не останавливался на первой версии модели / модели / года ... но чтобы он продолжал return каждый матч как новый $car?

В противном случае, в настоящее время вывод:

  • Honda Civic 1996
  • Jeep Liberty 2010

Но мне также нужно вернуть другой соответствующий Honda Civic 2004

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вы можете превратить свою функцию в генератор (см. Обзор генераторов 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
}
0 голосов
/ 13 ноября 2018

Идея состоит в том, чтобы построить массив для соответствующих автомобилей и вернуть этот список в конце функции (некоторые комментарии в коде) ...

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 - это полезно для отладки, но старайтесь избегать методов, которые одновременно обрабатывают данные и выдают результат, если вам не нужно.

...