搜索多个数组

时间:2012-10-25 20:28:54

标签: php arrays search multidimensional-array

我已经正式登场了,我无法找到解决这个问题的方法。任何帮助将非常感激!我已经尝试了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,3和3。 5.

PS:在所有现实中,最好是函数可以搜索多维数组并仅提取数组中所有数组中匹配的数字。

非常感谢你的帮助!

5 个答案:

答案 0 :(得分: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;
}

请注意,您可以使用$ multiArray [0](或任何子数组)作为基线,并检查所有其他内容,因为最终结果中的任何值都必须在所有单独的子阵列中。

答案 1 :(得分: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]);
    }
  }
}

答案 2 :(得分:0)

这个怎么样?

查找数组1和2中存在的数字。然后将这些结果与数组3进行比较,再次找到公共数字。只要你愿意,就继续前进。

这是你得到的吗?

答案 3 :(得分: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 );

答案 4 :(得分: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);