⊗ppSpOtAU 82 of 83 menu

Optimalisatie van overbodige arrays in PHP

Stel, een programmeur heeft de taak om de som van gehele getallen van 1 tot 100000000 te vinden.

Onze programmeur heeft een elegante oplossing voor deze taak geschreven, als volgt:

<?php echo array_sum(range(1, 100000000)); ?>

Een mooie oplossing, nietwaar? In één regel en zo. Maar het werkt niet! Probeer deze code uit te voeren en hij zal een fout tonen over het feit dat je te veel werkgeheugen hebt aangevraagd.

Hmm, 100000000 lijkt niet zo veel? Of toch? Laten we rekenen. De functie range maakt een array met 100000000 getallen. Stel dat PHP 2 bytes per getal toewijst - dan is er voor het opslaan van onze array 200000000 byte nodig, dat is ongeveer 200 megabyte werkgeheugen.

Maar in werkelijkheid is er veel meer werkgeheugen nodig vanwege de zeer hoge overheadkosten bij het opslaan van een array in PHP. Bijvoorbeeld, in mijn tekst geeft de foutmelding aan dat ik 4294967304 byte probeer toe te wijzen - dat is ongeveer 4 gigabyte!

Het is nu duidelijk waarom de fout optreedt - we hebben de toegestane geheugenlimiet ver overschreden.

Het is niet zo moeilijk om ons script te herschrijven naar een versie die praktisch geen werkgeheugen verbruikt:

<?php $sum = 0; for ($i = 1; $i <= 100000000; $i++) { $sum += $i; } echo $sum; ?>

Of nog beter, we gebruiken een wiskundige oplossing:

<?php $n = 1000000; $sum = $n * ($n + 1) / 2; echo $sum; ?>

Een programmeur had de taak om de faculteit van een bepaald getal te vinden. Hij loste het als volgt op:

<?php $n = 100; echo array_product(range(1, $n)); ?>

Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.

Een programmeur had de taak om het aantal cijfers te vinden dat nodig is om alle gehele getallen van 1 tot 1000000 te schrijven. Hij loste het als volgt op:

<?php echo strlen(implode('', range(1, 1000000))); ?>

Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.

Een programmeur had de taak om het aantal getallen te vinden die deelbaar zijn door 7 zonder rest, binnen een bepaald bereik. Hij loste het als volgt op:

<?php $arr = []; for ($i = 0; $i <= 1000; $i++) { if ($i % 7 == 0) { $arr[] = $i; } } echo count($arr); ?>

Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.

Een programmeur had de taak om de som van de delers van een getal te vinden. Hij loste het als volgt op:

<?php $num = 320; $divs = []; for ($i = 0; $i <= $num; $i++) { if ($num % $i == 0) { $divs[] = $i; } } echo array_sum($divs); ?>

Leg uit wat er mis is met deze code. Herschrijf de code naar een meer optimale versie.

Nederlands
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wij gebruiken cookies voor de werking van de site, analyse en personalisatie. De verwerking van gegevens gebeurt volgens het Privacybeleid.
alles accepteren aanpassen weigeren