Пересечения массивов или Super Intersect
04 Фев 2009
Пересечение массивов стандартной функцией выполняется не так как бы хотелось, по этому я придумал свою функцию, котора работает так как надо.
/* !!FIX!! Учитывется, если массив всего один, он же и возвращается :) ----- Описание: Функция делает проверку на вхождения каждого элемента в каждый под массив большого массива. т.е. скажем у Вас имеются N простых массивов. создаете один большой массив $bigarr путем добавления простых в большой: $arr1 = array(10,11,14,18,19,20); $arr2 = array(10,11,18,19,20,30,31,33); $arr3 = array(18,19,20,21,32,33,36,41,57,58,63); $bigarr = array(); $bigarr[] = $arr1; $bigarr[] = $arr2; $bigarr[] = $arr3; Исходный массив: $bigarr = Array ( [0] => Array ( [0] => 10 [1] => 11 [2] => 14 [3] => 18 [4] => 19 [5] => 20 ) [1] => Array ( [0] => 10 [1] => 11 [2] => 18 [3] => 19 [4] => 20 [5] => 30 [6] => 31 [7] => 33 ) [2] => Array ( [0] => 18 [1] => 19 [2] => 20 [3] => 21 [4] => 32 [5] => 33 [6] => 36 [7] => 41 [8] => 57 [9] => 58 [10] => 63 ) ) */ function array_super_intersect($bigarr) { $finded=array(); if (sizeof($bigarr)>1) { foreach ($bigarr as $num => $cmass) { $testmass = $bigarr; unset($testmass[$num]); foreach ($cmass as $cnum => $c_el) { reset($testmass); $ppp=0; foreach ($testmass as $tnum => $next_elements) { if (in_array($c_el, $next_elements)) { $ppp++; } } if ($ppp==sizeof($bigarr)-1 && !in_array($c_el, $finded)) $finded[] = $c_el; } } } else { $finded = array_values($bigarr[0]); } return $finded; } echo '<pre>'.print_R(array_super_intersect($bigarr),1).'</pre>'; /* получим Array ( [0] => 18 [1] => 19 [2] => 20 ) ) */
Последние комментарии