我有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.5X
和the $programCad[2] = 93.5
也应视为匹配。 (X =任何数字)
以下是对数组值的最终格式的更多解释:
数组值至少有2位= XX 最短值可以是XX,而最长值是XX.XX.XX.XX 但是,在某些情况下,它可能以1位数结尾,例如XX.X或XX.XX.X。
我知道如何进行这种部分匹配?
答案 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";
}
答案 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上看到它。