使用字符串比较函数比较另一个数组中的值是否存在于另一个数组中

时间:2016-08-28 12:04:48

标签: php arrays

我有2个逗号分隔值,我在2个数组中转换,命名为: $ companyCad和$ programCad

这两个数组以下列格式返回值:

$ companyCad

Array
(
    [0] => 52.10
    [1] => 62
    [2] => 64.15.44.25
    [3] => 65.10
    [4] => 65.14
    [5] => 65.21
    [6] => 70
    [7] => 71
    [8] => 71.15.12
    [9] => 93.55
)

$ programCad

Array
(
    [0] => 92.55
    [1] => 92.74
    [2] => 93
    [3] => 94.10
    [4] => 98.12
    [5] => 98.66
)

要比较$companyCad中是否存在任何$programCad值,请使用以下代码:

if (array_intersect($companyCad, $programCad)) {
    echo "Found";
} else {
   echo "Not found";
}

以上代码返回未找到,因为$programCad中的93.55未在数组$companyCad中找到。我知道代码工作正常。

但是我需要部分匹配,即:

如果$companyCad的值长于$programCad的值,例如$companyCad[9] = 93.55$programCad[2] = 93应该被视为匹配的值。

如果不应将$companyCad[9] = 93.55$programCad[2] = 93.1视为匹配。

如果$companyCad[9] = 93.5Xthe $programCad[2] = 93.5也应视为匹配。 (X =任何数字)

以下是对数组值的最终格式的更多解释:

数组值至少有2位= XX 最短值可以是XX,而最长值是XX.XX.XX.XX 但是,在某些情况下,它可能以1位数结尾,例如XX.X或XX.XX.X。

我知道如何进行这种部分匹配?

4 个答案:

答案 0 :(得分:3)

实现它的一种方法是使用嵌套循环和strpos来查看haystack(第一个循环的值)是否以针(第二个循环的值)开始。

$companyCad = array("52.10", "62", "64.15.44.25", "65.10", "65.14", "65.21", "70", "71", "71.15.12", "93.55");
$programCad = array("92.55", "92.74", "93", "94.10", "98.12", "98.66", "71.1");

$found = false;
foreach($companyCad as $comp) {
    foreach($programCad as $prog) {
        if(strpos($comp, $prog) === 0) {
            $found = true;
            break;
        }
    }
}

if($found === true) {
    echo "Found";
} else {
    echo "Not Found";
}

Live demo

答案 1 :(得分:1)

我认为您的解决方案就在这里。

$fileOfArray = array("52.10", "52", "65.10");
$matchOfArray = preg_grep("/52/", $fileOfArray);

输出为52.10

另请参阅此preg_grep

答案 2 :(得分:1)

尝试使用array_uintersect,如下所示:

$matches = array_uintersect($companyCad, $programCad, function($a, $b) {
    // Compare $a and $b
});

我在创建比较算法时已经没时间了。这是半完成的一个:

    // Split into components of number
    $a = explode('.', $a);
    $b = explode('.', $b);
    $aCount = count($a);


    // Chop off least signification digit when dealing with minor versions
    $a[count($a) - 1] = substr($a[count($a) - 1], 0, 1);
    $b[count($b) - 1] = substr($b[count($b) - 1], 0, 1);

    return (int)($a == $b);

我也考虑过这种方法,但爆炸更容易:

$versionA = preg_replace('/^(\d{2})(\.\d)?.*$/', '\1\2', $a);
$versionB = preg_replace('/^(\d{2})(\.\d)?.*$/', '\1\2', $b);

答案 3 :(得分:0)

这是一个返回数组中匹配项的解决方案:

$result = array_filter($programCad, function($pcad) use ($companyCad) {
    return preg_grep("/^$pcad/", $companyCad);
});

样本数据的结果是:

Array (
    [2] => 93
)

键(2)是原始$programCad数组中的位置。

如果您只是对事实感兴趣,是否匹配,您可以像这样测试:

if ($result) echo "found";

eval.in上看到它。