3

我已经正式碰壁了,我无法弄清楚这个问题的解决方案。任何帮助将非常感激!我已经尝试过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 和 5。

PS:实际上,如果该函数可以搜索多维数组并仅提取数组中所有数组中匹配的数字,那将是最好的。

非常感谢你的帮助!

4

5 回答 5

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] (或任何子数组)作为基线并检查所有其他值,因为最终结果中的任何值都必须在所有单独的子数组中。

于 2012-10-25T21:00:13.703 回答
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]);
    }
  }
}
于 2012-10-25T20:37:39.217 回答
0

这个怎么样?

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

这是你的意思吗?

于 2012-10-25T20:43:32.133 回答
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 );
于 2012-10-25T21:07:54.290 回答
0

in_array()随后执行迭代调用unset()是过度处理,它忽略了array_intersect()真正应该成为这种情况下任何可靠解决方案的英雄的魔力。

这是一个精益迭代函数:

代码:(演示

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()并声明正在处理的单个数组的数量,您可以使用它:

(最快的方法)

代码:(演示

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);
于 2018-01-30T14:45:37.787 回答