Мне нужно взять два массива и придумать процент сходства. то есть:
array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>1))
уегз
array( 0=>'1' , 1=>'45' , 2=>'6' , 3=>array(0=>1))
Где я думаю, что% 75
или
array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>'1'))
уегз
array( 0=>'1' , 1=>'2' , 2=>'6' , 3=>array(0=>'55'))
Не знаете, как подойти к этому. Просто нужно закончить рабочий процент. Спасибо .
Предполагая, что оба массива имеют одинаковую длину, вы можете перебирать и видеть, какие значения одинаковы для ключей, например:
<?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... ?>
Вот как я недавно занялся этой проблемой:
$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 $similarity = round(count($matches)/(count($array1)*100); echo 'SIMILARITY: ' . $similarity . '%'; // ie, SIMILARITY: 40% // (2 of 5 items in array1 have matches in array2 = 40%)
Установите счетчик равным нулю.
Итерации через массив, проверяя, равна ли каждая пара элементов. Если они есть, увеличьте количество.
В конце, сходство – это счет, деленный на общее количество элементов в массивах.
Это предполагает, что массивы имеют одинаковую длину и имеют одинаковые ключи – определение «подобия» в противном случае затруднено.
Вы могли бы в первую очередь подсчитать количество общих предметов. Затем вам понадобится функция, которая сообщает вам, является ли один подэлемент тем же или нет (bool).
Затем вы проходите оба массива сразу и подсчитываете одинаковые совпадения. Чтобы получить процент, разделите количество одинаковых по общему счету с более раннего и умножьте результат на 100.
Вам нужно решить, как вы хотите иметь дело с элементами, которые существуют только в одном, но не в другом массиве. Кроме того, если вы хотите войти внутрь элементов, если они также являются массивом, вы можете сделать is_same($a, $b)
рекурсивной и вернуть значение float (0-1, а не 0-100) и подсчитать эту долю вместо 0 FALSE или 1 TRUE.
Вот алгоритм для него.
int count = 0; for(int i = 0; i < arraySize; i++) { if(array1[i] == array2[i]) { count++; } } float percent = ((count/arraySize)*100);
count($array)
даст вам общее количество элементов в массиве. Затем вы можете сравнить числа в массиве и иметь счетчик для всех тех, которые являются одинаковыми, и сделать [total number of same number/the count($array)] *100
. Это должно дать процент