note 66347 added to function.array-intersect
| From: | andredejong at student dot ru dot nl | 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