Zajímá mě, jestli by se z toho kódu mezi file() a ksort() dala udělat funkce která bude yieldovat výstup do toho $indexes.
Vložit yield mezi file() a ksort() mi v tom kontextu nedává smysl, podle mne nic neušetříš.
Na začátku totiž načítáš najednou celý obsah souboru do paměti.
A právě aby nemusel být celý soubor v paměti najednou, můžeš přepsat kód tak že bude číst data po jednotlivých řádkách (např tou funkcí fgets( )) a zpracovávávat postupně. Během zpracovávání souboru pak bude muset být v paměti jen právě jedna zpracovávaná řádka. (mluvíme tady o vstupních datech $emails, nikoliv o datech které ukládáš do indexes)
Namísto načtení kompletního obsahu souboru pomocí $emails = file("adresy.txt"); bys tedy mohl použít "generátor" $emails = getLines("adresy.txt");
To pak funguje tak že v tom foreach se vždy provede kousek toho "generátoru" až dokud nevrátí hodnotu pomocí yield.
Pak se provede kód v tom foreach a pak zase ze provádí kód v tom generártoru,od místa kde skončil, až do dalšího yield, a tak pořád dokola až dokud generátor neskončí.
Nahrazení tohoto prvního řádku (a přidání generátoru dat jednotlivých řádek) je jediná věc co bys měl v kontextu tvého odkazovaného článku udělat.
Výhoda je že si můžeš do toho "generátoru" dát další logiku, npř filtrovat nevhodné řádky nebo třeba kompletně parsovat a vracet už zpracované řádky nebo třeba kompletní objekty atp.
Případně se dají generátory vrstvit, třeba jako filtry atd.
P.S. nezapomeň také ošetřit uzavření souboru v případě vyjímky (což je dobrý nápad v každém případě)
např zde:
https://www.php.net/manual/en/language.generators.overview.phpfunction getLines($file) {
$f = fopen($file, 'r');
try {
while ($line = fgets($f)) {
yield $line;
}
} finally {
fclose($f);
}
}