первое что бросается в глаза:
// Исключение должно быть одно, если оно есть, то пишем в отдельный массив
if (count($diff) == 1) {
$diff = current($diff);
$minus[$diff] = $diff;
}
break если нужно всего 1 совпадение, или я не вник в задачу....
остальное - как всегда - дъявол кроется в деталях
UPD: если все эти прыжки с бубном тянутся из бд - нужно постараться сократить выборку на уровне селектов, возможно даже сделать выборки из базы по более притянутым критериям и получить больше запросов, при меньшей работе с массивами, все таки бд изначально быстрее работают с сортировками и выборками/сравнениями. Для текстовых полей включить фултекст серч для быстрой выборки - и вперед.