note 66347 added to function.array-intersect

From: Date: Fri, 19 May 2006 15:48:23 +0000
Subject: note 66347 added to function.array-intersect
Groups: php.notes 
Request: Send a blank email to php-notes+get-111689@lists.php.net to get a copy of this message
array_intersect performs badly on intersecting large datasets (>100 values). the following function is faster for large arrays; <? function _array_intersect(&$ar ,$doneList = NULL,$size = NULL){ $smallest = 0; $largest = 0; $min = -1; $max = 0; // the intersection of 1 array is itself if (count($ar) == 1){ return($ar[0]); } // search smallest and largest array for ($i=0;$i < count($ar);$i++){ if (is_array($doneList) && in_array($i,$doneList)){ // items in donelist are already processed continue; } if (!isset($size[$i])){ $size[$i] = count($ar[$i]); // cache the count operation (better performance in large datasets) } // determine minimum if($size[$i] < $min || $min == -1){ $min = $size[$i]; $smallest = $i; } // determine maximum if (($size[$i] >= $max)){ $max = $size[$i]; $largest = $i; } } // flip keys of largest array $trans = array_flip($ar[$largest]); // do the comparison $output = array(); foreach($ar[$smallest] as $value){ if (isset($trans[$value])){ $output[] = $value; } } $doneList[] = $largest; $doneList[] = $smallest; // do a recursive call for moredimensional arrays if ((count($ar)) > count($doneList)){ $index = count($ar); $ar[] = $output; $output = _array_intersect($ar,$doneList,$size); unset($ar[$index]); } return $output; } ?> Equivalence: <? $result = _array_intersect($array); ?> is equivalent to : <? foreach($_array as $subSet){ $array[] = array_unique($subSet); } $result = call_user_func_array('array_intersect',$array); ?> ---- Server IP: 194.109.193.119 Probable Submitter: 62.194.205.142 ---- X-Spam-Status: No, hits=3.1 required=5.0 tests=DATE_MISSING,FROM_NO_LOWER autolearn=no version=2.64 ---- Manual Page -- http://www.php.net/manual/en/function.array-intersect.php Edit -- http://master.php.net/note/edit/66347 Del: integrated -- http://master.php.net/note/delete/66347/integrated Del: useless -- http://master.php.net/note/delete/66347/useless Del: bad code -- http://master.php.net/note/delete/66347/bad+code Del: spam -- http://master.php.net/note/delete/66347/spam Del: non-english -- http://master.php.net/note/delete/66347/non-english Del: in docs -- http://master.php.net/note/delete/66347/in+docs Del: other reasons-- http://master.php.net/note/delete/66347 Reject -- http://master.php.net/note/reject/66347 Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#111689) next »