Если два массива имеют одинаковую длину, можно просто двигать по кругу первый массив и сравнивать его элементы с элементами второго. Потом можно просто выбрать максимальное совпадение и перегнать в проценты. Примерно так:
$arr1 = [1,2,3,4,5,7,2,8];
$arr2 = [2,9,5,5,7,2,8,1];
$len = count($arr1);
$conformity = [];
for($i = 0; $i < $len; $i++) {
/**
* $temp содержит нули в позициях, где числа в двух массивах
* по одному и тому же индексу не равны. Единицы — там, где равны.
*/
$temp = array_map(function($x,$y){return intval($x==$y);}, $arr1, $arr2);
// Элементы полученного массива суммируются и добавляются в отчётный массив
$conformity[] = array_sum($temp);
// Массив прокручивается на одну позицию
$arr1[] = array_shift($arr1);
}
//С помощью max($conformity) выбирается максимальное совпадение элементов
echo sprintf("Max conformity is %s%%\n", number_format(100*(max($conformity)/$len), 2));
Это конкретно для ситуации, когда длина «колец» одинаковая.
Update: ещё один вариант:
$arr1 = [1,2,3,4,5,7,2,8];
$arr2 = [2,9,5,5,7,2,8,1];
function conformity($arr1, $arr2) {
$len = count($arr1);
$max = $curr = 0;
for($i = 0; $i < $len; $i++) {
array_map(function($x,$y)use(&$curr){$curr += intval($x==$y);}, $arr1, $arr2);
if($curr == $len) {
return 100;
}
$max = $max > $curr ? $max : $curr;
$curr = 0;
$arr1[] = array_shift($arr1);
}
return 100*($max/$len);
};
echo sprintf("Max conformity is %s%%\n", number_format(conformity($arr1, $arr2), 2));