find数组的元素在PHP的另一个数组中

时间:2016-02-17 18:27:54

标签: php

数组A:

486 987

数组B:

247-16-02-2009 486-16-02-2009 562-16-02-2009 1257-16-02-2009 486-16-02-2009 

我想搜索并列出在数组B中匹配的所有数组A元素,例如:486-16-02-2009(两次)。

4 个答案:

答案 0 :(得分:3)

您可以通过将$arrayA插入模式来使用正则表达式。这将在$arrayA项目中找到$arrayB个项目:

$pattern = implode("|", $arrayA);
$result  = preg_grep("/$pattern/", $arrayB);

要仅在$arrayB项的开头匹配,请使用^"/^$pattern/"

如果那里可能有特殊的模式字符,您可能希望通过$arrayA运行preg_quote()元素。

答案 1 :(得分:2)

你可以做这样的事情,但它可能没有像使用像array-intersect那样的php内置函数,因为我们正在进入循环地狱。如果任一阵列太大,您的脚本将慢慢爬行。

foreach ($arrB as $values) {
    foreach ($arrA as $compare) {
        if (substr($values, 0, strlen($compare)) == $compare) {
            //do stuff
        }
    }
}

答案 2 :(得分:1)

你必须走两个阵列搜索每个案例:

工作示例:http://ideone.com/pDCZ1R

<?php


$needle = [486, 987];
$haystack = ["247-16-02-2009", "486-16-02-2009", "562-16-02-2009", "1257-16-02-2009", "486-16-02-2009"];

$result = array_filter($haystack, function($item) use ($needle){
    foreach($needle as $v){
        if(strpos($item, strval($v)) !== false){
            return true;
        }
    }
    return false;
});

print_r($result);

答案 3 :(得分:0)

与其他两个答案有些相似,但这将是我的方法:

$matches = array(); // We'll store the matches in this array

// Loop through all values we are searching for
foreach($arrayA as $needle){
    // Loop through all values we are looking within
    foreach($arrayB as $haystack){
        if(strpos($needle, $haystack) !== false){
            // We found a match.
            // Let's make sure we do not add the match to the array twice (de-duplication):
            if(!in_array($haystack, $needle, true)){
                // This match does not already exist in our array of matches
                // Push it into the matches array
                array_push($matches, $haystack);
            }
        }
    }
}

注意此解决方案使用in_array()来阻止匹配重复。如果您希望匹配多个值的匹配项多次显示,则只需删除!in_array(...)作为条件的if语句。