获取php中两个数组的相似度百分比

时间:2012-02-15 17:40:03

标签: php

我需要采用两个数组并提出相似性百分比。即:

array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>1))

VERS

array( 0=>'1' , 1=>'45' , 2=>'6' , 3=>array(0=>1))

我认为%是75

array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>'1'))

VERS

array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>'55'))

不确定如何处理这个......只需要以可行的浮动百分比结束。谢谢。

6 个答案:

答案 0 :(得分:6)

以下是我最近解决这个问题的方法:

$array1 = array('item1','item2','item3','item4','item5');
$array2 = array('item1','item4','item6','item7','item8','item9','item10');

// returns array containing only items that appear in both arrays
$matches = array_intersect($array1,$array2);

// calculate 'similarity' of array 2 to array 1
// if you want to calculate the inverse, the 'similarity' of array 1
// to array 2, replace $array1 with $array2 below

$a = round(count($matches));

$b = count($array1);

$similarity = $a/$b*100;

echo 'SIMILARITY: ' . $similarity . '%';

// i.e., SIMILARITY: 40%
// (2 of 5 items in array1 have matches in array2 = 40%)

答案 1 :(得分:1)

将计数设为零。

遍历数组,检查每对元素是否相等。如果是,请增加计数。

最后,相似度是计数除以数组中元素的总数。

这假设数组的长度相同并且具有相同的键 - 否则很难定义“相似性”。

答案 2 :(得分:1)

假设两个数组的长度相同,您可以迭代并查看键的值是相同的,例如:

<?php
$a = array(1,2,3,4);
$b = array(1,2,4,4);
$c = 0;
foreach ($a as $k=>$v) {
    if ($v == $b[$k]) $c++;
}
echo ($c/count($a))*100;
// outputs 75
?>

或者只是使用in_array检查它们是否包含类似的项目。

<?php
$a = array(1,2,3);
$b = array(1,2,4);
$c = 0;
foreach ($a as $i) {
    if (in_array($i,$b)) $c++;
}
echo ($c/count($a))*100;
// outputs 66.66...
?>

答案 3 :(得分:0)

您首先可以计算总项数。然后你需要一个函数来告诉你一个子项是否相同(bool)。

然后你立刻浏览两个数组并计算相同的匹配。要获得百分比,请将相同数量除以之前的总数,然后将结果乘以100。

您需要决定如何处理仅存在于另一个数组中而不存在于另一个数组中的元素。此外,如果你想进入内部元素,如果它们也是一个数组,你可以使is_same($a, $b)函数递归并返回一个浮点值(0-1,而不是0-100)并计算该分数而不是0 FALSE或1是真的。

答案 4 :(得分:0)

count($array)会为您提供数组中元素的总数。然后你可以比较数组中的数字,并为所有相同的数字设置一个计数器并执行[total number of same number/the count($array)] *100。这应该给出百分比

答案 5 :(得分:0)

这是一个算法。

int count = 0;
for(int i = 0; i < arraySize; i++)
{
  if(array1[i] == array2[i])
  {
    count++;
  }

}

float percent = ((count/arraySize)*100);