<pre> <?php function array_multiple($array){ $max = count($array)-1; for($u = 0; $u <= $max; $u++){ for($s = 0; $s <= $max; $s++){ if($array[$u] == $array[$s]){ $d[$u]++; if($d[$u] > 1){ $lista[] = $array[$u]; } } } } for($u = 0; $u <= $max; $u++){ $data[$lista[$u]] .= $lista[$u]; } $osa = $data; if($osa != ""){ foreach($osa as $key => $value){ if($key != ""){ $out[] = $key; } } } return $out; } $lista = array("kekkonen", "seppo", "pelle", "jeppe", "kalle", "Kalle", "jeppe", "heikki", "seppo", "kekkonen", "kekkonen"); print_r($lista); print"\n\n"; print_r(array_multiple($lista)); ?>
hmm.. noi for:it vois varmaa korvata foreachilla...
Mun mielestä solu on oikea sana tähän asiaan, sillä normaalistihan taulukon osat on nimeltään soluja, ja eiks array oo taulukko?
Taulukossa on alkioita ja jokaisella alkiolla on oma indeksinsä.
Array ("indeksi" => "alkio")
no joo..
odys, miksi vaihoit nimimerkkisi täällä? jope oli kyl iha hyvä
Tuli tässä tehtyä oma optimoidumpi versio T.M:n funktiosta:
<?php function array_multiple($array) { $tulokset = array(); for ($i = 0, $n = count($array); $i < $n; $i++) { for ($i2 = $i+1; $i2 < $n; $i2++) { if ($array[$i] == $array[$i2]) { for ($i3 = 0, $n2 = count($tulokset); $i3 < $n2; $i3++) { if ($tulokset[$i3] == $array[$i]) { break(2); } } $tulokset[] = $array[$i]; } } } return($tulokset); } ?>
T.M:n koodista löysin joitakin virheitä, vaikka en koko koodia tajunnutkaan (siis niitä purkkakoodiosuuksia).
Ensimmäinen selvä virhe on tällä rivillä:
for($u = 0; $u <= $max; $u++){
$max muuttujassa on $array taulukon pituus. $max muuttujaa ei pitäisi käyttää, koska silmukassa käsitellään $lista taulukkoa. Tämä taas aiheuttaa tyhjiä alkioita $data taulukkoon, jotka pitää karsia myöhemmin if-lauseella (argh... ei tietoakaan optimoinnista).
Tämä rivi jäi minulle vähän hämärän peittoon:
$osa = $data;
Miksi kopioida turhaan taulukko ja siten kuluttaa vain enemmän muistia?
Tämä rivi taas vasta olikin mielenkiintoinen:
if($osa != ""){
$osa on taulukko, mutta sitä verrataan merkkijonoon. Jos halutaan tarkistaa, onko taulukko tyhjä, niin ehkä ennemmin näin:
if(count($osa) != 0){
Ja tämä if-lause on turha, jos korjaa aiemman for-silmukan:
if($key != ""){
Omasta koodistani tähän sovitettuna voisi vielä tehdä seuraavan optimoinnin. Korvattava rivi:
for($s = 0; $s <= $max; $s++){
Korvaava rivi:
for($s = $u+1; $s <= $max; $s++){
Silmukkaa suoritetaan huomattavasti vähemmän nyt. :-)
hienoa!
turhan nälvimisen olis voinu jättää pois :P
phpssä on valmiskin funktio
Ei ole olemassa tämmöistä funkkaria.. vähän saman tyyppinen.
Tämä funktio ei palauta tästä arraystä kaikkia tuplia:
Array ( 0 = "Moi", 1 = "Jou", 2 = Array ( "Blaah", "Blaah", ), 3 = "Moi" )
Se jättää Blaahhit pois koska se ei tarkista arrayn sisällä olevia arraytä..
Sen ominaisuuden voisi ainakin laittaa..
Ja tässä olisi vielä vähän optimoidumpi versio kyseisestä funkkarista:
<?php function Duplicates ($array) { $count = @Array_Count_Values($array); while (list($key, $val) = each($count)) { if ($val > 1) $out[] = $key; } return $out; } ?>
Ei tehdä niitä asioita liian vaikeasti ;)
function array_multiple($array){ $count = @array_count_values($array); foreach($count as $key => $value){ if($value > 1) $out[] = $key; } return $out; }
tossa taas hieman optimoidumpi versio xD
mitähän vielä joku keksis...
kooditagit jäi pois:
function array_multiple($array){ $count = @array_count_values($array); foreach($count as $key => $value){ if($value > 1) $out[] = $key; } return $out; }
Toi foreach on iha ruma.. en mä semmosia käytä!
Ei oo nopeus eroo pahemmin..
öh... ruma? paljon nopeampi, älä ny jaksa valittaa tämmöisistä :)
No siis mun mielestä toi foreach on ihan kauhee.. eikä noilla oo nopeuseroa yhtää..
foreach on paras x)
Nyt on kyllä aivan pakko heittää tänne tämä testin tulos!
Ajoin skriptin 3, jossa tulostettiin arrayssä olevat 10 000 numeroa foreachilla sekä while list each tyylillä ja while list each sai 0.5 sekuntia paremman keskiarvon ajankäytössä!
Refreshasin kummankin 3 kertaa.
Tässä tulokset!
Foreach:
1. 9.095173
2. 10.867359
3. 10.07582
While list each:
1. 8.974901
2. 9.268379
3. 9.075117
Tässä on vielä testi skripti:
<?php $start1=gettimeofday(); list($start2, $start3) = explode(":", exec('date +%N:%S')); $array = range (1,100000); foreach ($array as $key => $val) { echo "$val<br>\n"; } /*while (list($key,$val) = each($array)) { echo "$val<br>\n"; }*/ $end1=gettimeofday(); $totaltime1 = (float)($end1['sec'] - $start1['sec']) + ((float)($end1['usec'] - $start1['usec'])/1000000); list($end2, $end3) = explode(":", exec('date +%N:%S')); $totaltime2 = (float)($end3 - $start3) + ((float)($end2 - $start2)/1000000000); echo "$totaltime2\n<br>"; echo "$totaltime1\n"; ?>
täh, miten toi voi olla mahollista? miten se foreach sit toimii?? lol
Ihmettelen kyllä itsekkin testin tuloksia.. luulin että ne olisivat täysin yhtä nopeat.
Ero selittynee näin:
Foreach tekee kopion taulukosta ja käy sen läpi.
List .. each menetelmällä käydään itse taulukko suoraan läpi sisäistä pointteria käyttäen.
Hyvä että tuli tämäkin asia selväksi. :)
Eli while, list, each on nopeampi kuin foreach.
Aihe on jo aika vanha, joten et voi enää vastata siihen.