$quantity) { if (!\in_array($item, $possibleItems)) { $possibleItems[] = $item; } } } // create the random variables foreach ($orders as $items) { foreach ($possibleItems as $item) { $this->items[$item][] = $items[$item]; } } // create the affinity table foreach ($possibleItems as $item1) { foreach ($possibleItems as $item2) { if ($item1 !== $item2 && !isset($this->affinity[$item1][$item2]) && !isset($this->affinity[$item2][$item1])) { $this->affinity[$item1][$item2] = Correlation::bravaisPersonCorrelationCoefficientPopulation($this->items[$item1], $this->items[$item2]); $this->affinity[$item2][$item1] = $this->affinity[$item1][$item2]; } } } // sort correlations foreach ($possibleItems as $item) { \arsort($this->affinity[$item]); } } /** * Get the affinity between items * * @param mixed $item Item to check for possible affinities * @param int $resultSize How many top matches should be returned * * @return array * * @since 1.0.0 */ public function getAffinity(mixed $item, int $resultSize = 0) : array { if (!isset($this->affinity[$item])) { return []; } return $resultSize < 1 ? $this->affinity[$item] : \array_slice($this->affinity[$item], 0, $resultSize); } }