2012-10-25 96 views
2

我已经正式命中了一堵墙,我无法弄清楚这个问题的解决方案。任何帮助将非常感激!我试过array_intersect(),但它只是继续运行在函数中的第一个数组,它不会工作。搜索多个阵列

我有一个数组的无限量的(我将展示4出于演示的目的),例如:

// 1. 
array(1,2,3,4,5); 
// 2. 
array(1,3,5); 
// 3. 
array(1,3,4,5); 
// 4. 
array(1,3,5,6,7,8,9); 

我需要弄清楚如何搜索所有的数组和发现只存在了数在所有4个阵列中。在这个例子中,我只需要从数组中取出数值 - 1 & 5.

PS:在所有现实中,如果函数可以针对多维数组进行搜索并仅提取数字匹配数组中的所有数组。

非常感谢您的帮助!

+3

这是一个实际应用的家庭作业或假设的情况?因为这种方法会有所不同。例如,你说无限数量的数组,但是数组真的不超过每个约8个项目? –

回答

1

有趣的问题!这工作:

function arrayCommonFind($multiArray) { 

    $result = $multiArray[0]; 
    $count = count($multiArray); 
    for($i=1; $i<$count; $i++) { 
     foreach($result as $key => $val) { 
      if (!in_array($val, $multiArray[$i])) { 
       unset($result[$key]); 
      } 
     } 
    } 
    return $result; 
} 

请注意,你可以只用$多阵列[0](或任何子阵列)作为基准,并检查所有反对的人,因为这将是最终结果的任何值必须在所有单独的子阵列中。

0

如果它在一个多维数组你可以

$multiDimensional = array(/* Your arrays*/); 
$found = array_pop($multiDimensional); 
foreach($multiDimensional as $subArray) 
{ 
    foreach($found as $key=>$element) 
    { 
    if(!in_array($element, $subArray) 
    { 
     unset($found[$key]); 
    } 
    } 
} 
+0

如果它不在第一个子数组中,我们可以立即忽略它,那么如果它不在随后的数组中,我们将它从找到的数组中移除,并且以后不要查找它。 –

+0

请原谅我的无知,但我跑了这个,我不知道如何吐出结果: – LargeTuna

+0

'var_dump($ found);'或'print_r($ found)'; –

0

这个怎么样?

查找数组1和数组2中存在的数字。然后将这些结果与数组3进行比较以再次找到常用数字。继续下去,只要你想。

这是你正在得到什么?

+0

这不会工作,因为值可能来回交换每个数组中的项目的interms。数组2可能包含数组1的值,而数组1可能包含数组3的值等。永远不会有填充数组的模式。这就是为什么我只需要查找每个数组中存在的值,而不管数组中的元素是什么。 – LargeTuna

+1

hm,但是如果某个元素对于数组1和2不是相互的,那么它就不会出现在数组2,3中。在你的例子中,1,3和5对于数组1和2是相互的,所以比较结果与数组3以及后面的数组4(等等)将返回相同的结果 - 具有1,3和5的新数组作为元素。 – Wh1T3h4Ck5

+1

换句话说,如果您想要所有数组的相互元素的结果集,则该结果集只能比您比较前两个数组的结果更短或更短(不会出现新元素,因为它们不会出现, t存在于前两个数组中)。 – Wh1T3h4Ck5

0

根据您的评论对我的其他问题这里是一个更好的解决方案:

<?php 
// 1. merge the arrays 
$merged_arrays = array_merge($arr1, $arr2, $arr3, $arr4, ...); 
// 2. count the values 
$merged_count = array_count_values($merged_arrays); 
// 3. sort the result for elements that only matched once 
for($merged_count as $key => $value){ 
    if ($value == 1) { 
     // 4. unset the values that didn't intersect 
     unset($merged_count($key)); 
    } 
} 
// 5. print the resulting array 
print_r($merged_count); 
0

表演迭代in_array()电话之后unset()是过度处理,它忽视了array_intersect()魔术这确实应该是任何固体的英雄这个案例的解决方案。

这里是稀迭代函数:

代码:(Demo

function array_intersect_multi($arrays){ // iterative method 
    while(sizeof($arrays)>1){ 
     $arrays[1]=array_intersect($arrays[0],$arrays[1]); // find common values from first and second subarray, store as (overwrite) second subarray 
     array_shift($arrays); // discard first subarray (reindex $arrays) 
    } 
    return implode(', ',$arrays[0]); 
} 
echo array_intersect_multi([[1,2,3,4,5],[1,3,5],[1,3,4,5],[1,3,5,6,7,8,9]]); 
// output: 1, 3, 5 

这里假设你将单独的阵列封装成阵列的索引数组。


我也考虑过递归函数,但递归速度较慢,并使用更多的内存。

function array_intersect_multi($arrays){ // recursive method 
    if(sizeof($arrays)>1){ 
     $arrays[1]=array_intersect($arrays[0],$arrays[1]); // find common values from first and second subarray, store as (overwrite) second subarray 
     array_shift($arrays); // discard first subarray (reindex $arrays) 
     return array_intersect_multi($arrays); // recurse 
    } 
    return implode(', ',$arrays[0]); 
} 

此外,如果你是快乐的扁平化的阵列到一个与array_merge()和申报单阵列的数量正在处理,你可以使用这个:

(最快方法)

代码:(Demo

function flattened_array_intersect($array,$total_arrays){ 
    return implode(', ',array_keys(array_intersect(array_count_values($array),[$total_arrays]))); 
} 
echo flattened_array_intersect(array_merge([1,2,3,4,5],[1,3,5],[1,3,4,5],[1,3,5,6,7,8,9]),4); 

或更换array_intersect()array_filter()(略慢,更详细):

function flattened_array_intersect($array,$total_arrays){ 
    return implode(', ',array_keys(array_filter(array_count_values($array),function($v)use($total_arrays){return $v==$total_arrays;}))); 
} 
echo flattened_array_intersect(array_merge([1,2,3,4,5],[1,3,5],[1,3,4,5],[1,3,5,6,7,8,9]),4);