phpbar.de logo

Mailinglisten-Archive

[php] is_in_array

[php] is_in_array

Ulf Wendel ulf.wendel_(at)_netzservice.de
Sun, 05 Dec 1999 20:45:04 +0100


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