reiniger Posted July 8, 2011 Report Share Posted July 8, 2011 (edited) 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 July 8, 2011 by reiniger Quote Link to comment Share on other sites More sharing options...
briedis Posted July 8, 2011 Report Share Posted July 8, 2011 (edited) izmanto ===, nevis == Būtu laiks izstudēt šo: http://php.net/manual/en/types.comparisons.php Edited July 8, 2011 by briedis Quote Link to comment Share on other sites More sharing options...
reiniger Posted July 8, 2011 Author Report Share Posted July 8, 2011 Paldies par informāciju. Noderēs. Quote Link to comment Share on other sites More sharing options...
codez Posted July 8, 2011 Report Share Posted July 8, 2011 šķiet, ka php mēģina pārveidot 'test' par skaitli, kā rezultātā iegūst 0 un 0==0 ir true. Quote Link to comment Share on other sites More sharing options...
Maris-S Posted July 8, 2011 Report Share Posted July 8, 2011 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. Quote Link to comment Share on other sites More sharing options...
reiniger Posted July 8, 2011 Author Report Share Posted July 8, 2011 jo php nosacījumā norādīto count() rēķinās katra cikla solī uz ļoti lieliem cikliem būs veiktspējas zudums. Tas tikai kā ieskats uz problēmu tika uz ātro uzcepts, jo savā variantā saskāros ar šo problēmu. Quote Link to comment Share on other sites More sharing options...
codez Posted July 8, 2011 Report Share Posted July 8, 2011 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 Quote Link to comment Share on other sites More sharing options...
daGrevis Posted July 8, 2011 Report Share Posted July 8, 2011 Ahāā, bet ne vienmēr foreach() derēs. Quote Link to comment Share on other sites More sharing options...
spainis Posted July 8, 2011 Report Share Posted July 8, 2011 masīviem ar kuru tur PHP versiju, tiek glabāts izmērs masīvā, ko ta count() ar atgriež Quote Link to comment Share on other sites More sharing options...
Maris-S Posted July 8, 2011 Report Share Posted July 8, 2011 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. Quote Link to comment Share on other sites More sharing options...
codez Posted July 8, 2011 Report Share Posted July 8, 2011 varēji arī foreach nobenčmārkot. Quote Link to comment Share on other sites More sharing options...
briedis Posted July 8, 2011 Report Share Posted July 8, 2011 Ahāā, bet ne vienmēr foreach() derēs. O, piemēru studijā, kad foreach neder priekš masīva iterēšanas :) Quote Link to comment Share on other sites More sharing options...
marrtins Posted July 9, 2011 Report Share Posted July 9, 2011 tipu pārveidošanas automatizācija ir ļoti liels avots neuzmanības kļūdām, bet nu te katram savs viedoklis. Ja programmētājs ir dauns, tad nekāda tipu sitēma nelīdzēs. Quote Link to comment Share on other sites More sharing options...
daGrevis Posted July 9, 2011 Report Share Posted July 9, 2011 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... Quote Link to comment Share on other sites More sharing options...
Maris-S Posted July 9, 2011 Report Share Posted July 9, 2011 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.