Optimizarea trecerilor inutile ale buclei în PHP
În următorul cod, un programator verifică
dacă numărul 3 există în array:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$exists = false;
foreach ($arr as $elem) {
if ($elem == 3) {
$exists = true;
}
}
var_dump($exists);
?>
Ce este în neregulă cu soluția sa? Se pare că
nu se fac operații inutile în buclă. Problema,
însă, este că după ce s-a stabilit
că numărul 3 există în array - bucla
continuă să se învârtă până la sfârșitul array-ului.
Cel mai irațional va fi dacă numărul 3
va fi găsit undeva la începutul array-ului, iar array-ul însuși
va avea lungimea, să zicem, 1000 de elemente.
Se vor face o mie de iterații inutile
ale buclei! Nu este optim.
Să optimizăm codul, oprind bucla la timp:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$exists = false;
foreach ($arr as $elem) {
if ($elem == 3) {
$exists = true;
break;
}
}
var_dump($exists);
?>
Următorul cod calculează câte
elemente din array trebuie adunate,
pentru ca suma să devină mai mare decât 10.
Efectuați optimizarea:
<?php
$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$sum = 0;
$i = 1;
foreach ($arr as $elem) {
$sum += $elem;
if ($sum <= 10) {
$i++;
}
}
echo $i;
?>
Următorul cod afișează numerele pare din intervalul dat. Efectuați optimizarea:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0) {
echo $i;
}
}
?>
Următorul cod afișează numerele
divizibile simultan cu 2
și cu 3. Efectuați optimizarea:
<?php
for ($i = 0; $i <= 100; $i++) {
if ($i % 2 === 0 and $i % 3 === 0) {
echo $i;
}
}
?>