Jump to content
php.lv forumi

If salīdzināšana...


reiniger

Recommended Posts

Sveiki

 

Šodien ņemoties pamanīju vienu interesantu lietu

$arr = array(0,1,'test',2,3);

for($i=0;$i<count($arr);$i++){
 if($arr[$i] == 'test')
    echo 'test, ';
 else
    echo $i.', ';
}

Rezultāta iegūst: test, 1, test,2,3!

 

Kods šeit 0 == 'test' uzskata par true.

 

Kā tas ir iespējams un kas ir jamaina, lai izbēgtu no šadas situācijas?

Edited by reiniger
Link to comment
Share on other sites

Codez, tieši tā, automātiska tipu castošana, par ko Paskālisti un Delphisti brauc virsū C piekritējiem. Zināmā mērā es arī vairāk piekrītu Pascal veidīgo valodu pieejai šajā ziņā, jo tipu pārveidošanas automatizācija ir ļoti liels avots neuzmanības kļūdām, bet nu te katram savs viedoklis.

 

Mani laikam uzskatīs par baigi piekasīgu, bet labāk ciklu nosacījumus raksti tā:

 

$arr = array(0,1,'test',2,3);

$to = count($arr);
for($i=0; $i<$to; $i++){
 if($arr[$i] == 'test')
    echo 'test, ';
 else
    echo $i.', ';
}

 

jo php nosacījumā norādīto count() rēķinās katra cikla solī uz ļoti lieliem cikliem būs veiktspējas zudums.

Link to comment
Share on other sites

Mani laikam uzskatīs par baigi piekasīgu, bet labāk ciklu nosacījumus raksti tā:

 

$arr = array(0,1,'test',2,3);

$to = count($arr);
for($i=0; $i<$to; $i++){
 if($arr[$i] == 'test')
    echo 'test, ';
 else
    echo $i.', ';
}

 

jo php nosacījumā norādīto count() rēķinās katra cikla solī uz ļoti lieliem cikliem būs veiktspējas zudums.

 

n vēl labāk protams ir masīvam iterēt cauri ar foreach

 

$arr = array(0,1,'test',2,3);

foreach($arr as $i=>$el){
 if($el == 'test')
    echo 'test, ';
 else
    echo $i.', ';
}

http://codepad.org/iz9XUOvJ

Link to comment
Share on other sites

PHP Version 5.2.17

 

$numbers = array_fill(0, 1000000, 0);

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

//$to = count($numbers);
for ($i = 0; $i < count($numbers); $i++)
$a = 1;

echo(count($numbers));
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "<br>This page was created in ".$totaltime." seconds";

 

Ar count ciklā: This page was created in 0.33966994285583 seconds

Ar mainīgo: This page was created in 0.10282397270203 seconds

 

It kā sīkums uz miljonu ierakstu, bet tomēr.

Link to comment
Share on other sites

O, piemēru studijā, kad foreach neder priekš masīva iterēšanas :)

 

Nopietni? Es tikko piecēlos.

 

Labojums:

 

Tad kad vajag pašreizējo cikla iterācijas daudzumu.

 

for ($i = 0; $i < 100; ++$i)

 

Šajā gadījumā $i.

 

 

foreach ($array as $key => $value)

 

Ja masīvs ir asociatīvs, tad nekā. Vienīgi...

 

$i = 0;
foreach ($array as $key => $value) {
// Maģija!

++$i;
}

 

Bet tad jau labāk uzreiz for izmantot...

Link to comment
Share on other sites

Codez, pēc mana piemēra jebkurš var nobenčmarkot ko vien vēlās. :)

 

To piezīmi par funkcijas izmantošanu cikla nosacījumā pa tiešo es nedomāju tieši tikai izmantošanai masīviem, bet vispārēji par ciklu uzbūvei.

 

 

Marrtins, ja programmētājs ir daunis, viņam labāk būtu jādomā par kādu pavisam citu nodarbošanās veidu. Grozies kā gribi, cilvēks nav mašīna un jebkurš ģēnijs varēs pieļaut neuzmanības kļūdu, tieši šī iemesla dēļ kritiskajās sistēmās (aviācija un tml.) pielieto arī tādas valodas kā ADA, ne vienmēr, bet tomēr. Tādas valodas kā CPP ir neapšaubāmi labas valodas, bet kā jebkurai valodai ir arī savi trūkumi. Es, piemēram, neuzskatu par labu zīmi valodai to, ka garbage collector uzrakstīt ir vieglāk, nekā programmu bez memory leaks. Nopietnām programmām arī bieži ir bugi saistīti ar memory leaks, buffer underrun un tml., bet neviens viņu programmētājus neuzskata par dauņiem. Protams tādas kļūdas var rasties jebkurā valodā un neuzmanības kļūdas neviens Paskāls, ne ADA nevarēs izslēgt, samazināt gan varētu.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...