Codewars: divisors (range, array_values)
Codewars: divisors (range, array_values)
Glossary overview

Codewars: divisors (range, array_values)

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";
}