Поскольку в запросах используется только равенство, то изначально не разделять свойства товаров по символу =.
Подготовить массив, где каждой паре 'свойство=значение' будет соответствовать массив со списком товаров.
[
'width=5' => [0, 3],
'ht=3' => [0, 3],
'len=10' => [0],
'name=circ' => [1, 2],
'rad=5' => [1, 2].
'name=sqr' => [3]
]
Затем по списку свойств в запросе выбирать массивы, если их больше одного, то находить их пересечение через array_intersect и выдавать размер полученного пересечения.
array_intersect([0, 3], [0, 3]) = [0, 3]
[1, 2]
[3]
array_intersect([0, 3], [0]) = [0]