Create a function named divisors/Divisors that takes an integer n > 1 and returns an array with all of the integer’s divisors(except for 1 and the number itself), from smallest to largest. If the number is prime return the string ‘(integer) is prime’ (null in C#, empty table in COBOL) (use Either String a in Haskell and Result<Vec<u32>, String> in Rust).
Examples:
divisors(12) --> [2, 3, 4, 6]
divisors(25) --> [5]
divisors(13) --> "13 is prime"
My solution
<?php
function divisors($integer) {
// Your code here
$divisors = [];
for ($i = 2; $i < $integer; $i++) {
if ($integer % $i == 0) {
$divisors[] = $i;
}
}
return (count($divisors) > 0) ? $divisors : ($integer . ' is prime');
}
Solution I liked
function divisors($integer) {
$dividers = array_values(array_filter(range(2, $integer-1), function($value) use ($integer) {
return !($integer % $value);
}));
return (empty($dividers) or ($integer === 2 )) ? $integer.' is prime' : $dividers;
}
range(2, $integer - 1)creates an array containing every integer from 2 up to n-1.
For example: range(2, 14) → [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]- And now array_filter takes this array and filter its elements. array_filter removes all numbers that are not divisors of $integer. After filtering, the array contains only true divisors.
or
function divisors(int $integer) {
return array_values(array_filter(range(2, $integer), fn ($n) => ($integer % $n == 0 && $n != $integer))) ?: "$integer is prime";
}
