Это может помочь другим людям из Интернета, ищущим более лаконичное решение этой проблемы.
Мое решение требует PHP7 или выше. Идея состоит в том, чтобы сопоставить массив с анонимной функцией и воспользоваться подсказками типов.
$podcasts = getPodcasts();
$listItems = array_map(function (Podcast $podcast) {
return "<li>" . $podcast->getTitle() . "</li>";
}, $podcasts);
$podcastsHtml = "<ul>\n" . implode("\n", $listItems) . "\n</ul>";
В большинстве случаев foreach
можно преобразовать в array_map
, просто требуется небольшой сдвиг парадигмы в сторону функционального программирования .
Если вы используете Laravel (я уверен, что другие фреймворки также имеют Коллекции), вы можете даже связать эти карты массивов с фильтрами массивов и другими функциональными вещами, такими как:
$html = "<ul>" . collect($podcasts)
->filter(function (Podcast $p) { return $p !== null; }) // filtering example
->map(function (Podcast $p) { return "<li>".$p->getTitle()."</li>"; }) // mapping
->implode("\n") . "</ul>";
В простой цепочке php эти функции массива выглядят довольно некрасиво ...
Но вот, пожалуйста! родной способ указания типа итерации массива.