2012-10-25 166 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);