Mailinglisten-Archive |
Jan Lehnardt wrote: > > Hallo Liste, > Ich hatte Gestern das Problem der Schnittmerngenermittlung von Werten > in Arrays. Till hat daraufhi folgendes gepostet: > <till> > $ret_array = array(); > while(list($key, $value) = each($array1)) > if(is_in_array($array2, $value)) > $ret_array[] = $value; > > return($ret_array); > </till> > da die function is_in_array() in php3 nicht zur verfuegung steht, > musste ich selbst eine bauen. Der Code unten funktioniert zwar, nur > wollte ich wissen, ob da noch irgendwas nicht richtig/logisch/optimal > ist. > > <jan> > function is_in_array($array,$needle) > { > $res=0; > for($i=0;$i<=count($array);$i++) > { > if($array[$i]==$needle) $res=1; > } > return($res); > } > </jan> > Hey, hey, da hätten doch schon alle Informatiker schreien müssen! Der gepostete Ansatz ist uneffektiv. Im günstigsten Fall werden count($array1) Operationen ausgeführt, im Extremfall count($array1)*count($array2) Operationen. Wieviele genau hängt von den Daten ab. Es ist allerdings auch schnuppe die genaue Zahl zu kennen, einzig wichtig ist die Betrachtung des Rechenoperators. Obige Lösung weißt einen Multiplikator auf. Dabei genügt ein Plus. Es geht auch mit count($array1)+count($array2) Operationen. Durch eine einfache Invertierung gelingt eine große Einsparung von Rechenzeit unter einem i.d.R. vernachlässigbaren Mehrverbrauch an Speicher. $gemeinsam = array(); $invers = array(); reset($array1); while (list($k, $v)=each($array1)) $invers[$v]=$k; // Für Sparsame: unset($array1); reset($array2); while (list($k, $v)=each($array2)) if (isset($invers[$v])) $gemeinsam[]=$v; Ulf
php::bar PHP Wiki - Listenarchive