Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: array_multiple

Sivun loppuun

T.M. [07.08.2003 20:39:33]

#

<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));

?>

T.M. [08.08.2003 01:47:39]

#

hmm.. noi for:it vois varmaa korvata foreachilla...

Gwaur [08.08.2003 05:09:16]

#

Mun mielestä solu on oikea sana tähän asiaan, sillä normaalistihan taulukon osat on nimeltään soluja, ja eiks array oo taulukko?

odys [08.08.2003 06:18:03]

#

Taulukossa on alkioita ja jokaisella alkiolla on oma indeksinsä.

Array ("indeksi" => "alkio")

T.M. [08.08.2003 22:51:57]

#

no joo..
odys, miksi vaihoit nimimerkkisi täällä? jope oli kyl iha hyvä

mikaelh [09.08.2003 12:24:02]

#

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. :-)

T.M. [09.08.2003 16:52:10]

#

hienoa!
turhan nälvimisen olis voinu jättää pois :P

(nimetön) [11.08.2003 13:55:52]

#

phpssä on valmiskin funktio

odys [11.08.2003 15:23:19]

#

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..

odys [11.08.2003 19:16:49]

#

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 ;)

T.M. [12.08.2003 14:08:16]

#

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...

T.M. [12.08.2003 14:10:20]

#

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;
}

odys [12.08.2003 18:46:23]

#

Toi foreach on iha ruma.. en mä semmosia käytä!
Ei oo nopeus eroo pahemmin..

T.M. [12.08.2003 19:35:01]

#

öh... ruma? paljon nopeampi, älä ny jaksa valittaa tämmöisistä :)

odys [12.08.2003 20:04:25]

#

No siis mun mielestä toi foreach on ihan kauhee.. eikä noilla oo nopeuseroa yhtää..

T.M. [12.08.2003 20:19:14]

#

foreach on paras x)

odys [12.08.2003 20:52:56]

#

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.M. [12.08.2003 21:25:30]

#

täh, miten toi voi olla mahollista? miten se foreach sit toimii?? lol

odys [13.08.2003 20:38:39]

#

Ihmettelen kyllä itsekkin testin tuloksia.. luulin että ne olisivat täysin yhtä nopeat.

mikaelh [21.08.2003 22:09:15]

#

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.

odys [23.08.2003 10:55:43]

#

Hyvä että tuli tämäkin asia selväksi. :)

Eli while, list, each on nopeampi kuin foreach.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta