<?php
class GreatestCommonDivisor
{
/**
* Get the divisor of a given number.
*
* @param int $num
* The number.
*
* @return int[]
* The divisors of the number.
*/
private function factors(int $num): array
{
return array_filter(
range(1, $num),
function (int $i) use ($num) {
return 0 === $num % $i;
}
);
}
/**
* Get the greatest common divisor.
*
* @param int ...$x
* The numbers.
*
* @return int
* The greatest common divisor.
*/
public function gcd(...$x): int
{
$x = array_map([$this, 'factors'], $x);
$intersect = array_intersect(...$x);
return end($intersect);
}
}
trait gcdTrait
{
/**
* Get the greatest common divisor.
*
* @param int ...$x
* The first number.
*
* @return int
* The greatest common divisor.
*/
function gcd(...$x): int
{
return (new GreatestCommonDivisor())->gcd(...$x);
}
}
class customClass {
use gcdTrait;
}
$foo = new customClass();
echo $foo->gcd(10, 20, 45);