PHP

Задачка по PHP (Создание функции)

Нашел не много трудную для меня задачу, пока еще не пытался сделать, но уже сомневаюсь что получится, поэтому вот..

Дружественные числа - два различных числа, для которых сумма всех собственных делителей первого числа равна второму числу и наоборот, сумма всех собственных делителей второго числа равна первому числу.

Например, 220 и 284. Делители для 220 это 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, сумма делителей равна 284. Делители для 284 это 1, 2, 4, 71 и 142, их сумма равна 220.

Задача: найдите все пары дружественных чисел в промежутке от 1 до 10000. Для этого сделайте вспомогательную функцию, которая находит все делители числа и возвращает их в виде массива. Также сделайте функцию, которая параметром принимает массив, а возвращает его сумму.

Помогите
Не надо делать "функцию, которая параметром принимает массив, а возвращает его сумму". Эта функция уже есть в языке: https://www.php.net/manual/ru/function.array-sum.php

function dividers($n) { // возвращает массив всех делителей $n
$r = [];
for ($t = 1; $t * $t < $n; ++$t) {
if ($n % $t == 0) {
$r[] = $t;
$r[] = $n / $t;
}
}
if ($t * $t == $n) { $r[] = $t; }
return $r;
}

for ($i = 1; $i < 10000; ++$i) {
for ($j = $i + 1; $j <= 10000; ++$j) {
if (array_sum(dividers($i)) == $j && array_sum(dividers($j)) == $i) {
echo $i, ' ', $j, "\n";
}
}
}
SR
Sohib Rahimberdiev
64 013
Лучший ответ
Андрей Юрьевич Странно, но код не работает, ничего не выводит.
Олег Рогов Что за потреблядство и неуважение к людям? Вам человек помог с задачей. Ни лайка, не выбора лучшего ответа.
https://pastebin.com/wk0C0pNn

Я только не пойму, а зачем вам это всё нужно? В школе PHP не проходят. Значит, это какие-то курсы или техникум/вуз. Так вот, извините, но если вы даже ЭТО не можете выполнить, значит вам нечего делать в профессии. Это самые азы.

Если вы пропустили какую-то тему (циклы? функции? массивы?), значит нужно срочно нанимать репетитора или попытаться разобраться по урокам в интернете самому. Срочно! Дальше будет хуже.
AD
Aleksandr Dubakov
38 633
идеальное решение, выглядит очень даже симпотично
Скрипт рабочий, но обрабатывает секунд 6-7, из-за отрезка до 10000:

//Находить делители числа
function allDivisorsOfNum($num){
$arrDiv = [];
for ($i=1; $i <= $num; $i++) {
if ($num % $i == 0) {
$arrDiv[] = $i;
}
}
return $arrDiv;
}

//Легче использовать встроенную array_sum, но в задаче указано создать собственную
function arrSum($arr){
$result = 0;
foreach ($arr as $value) {
$result += $value;
}
return $result;
}

//Вот и сам способ
for ($i=1; $i <= 10000; $i++) {
$one = allDivisorsOfNum($i);
array_pop($one);
$newOne = array_sum($one);
$two = allDivisorsOfNum($newOne);
array_pop($two);
$newTwo = array_sum($two);
if ($i == $newTwo && $i != $newOne) {
echo "$i - $newOne; ";
}else{
continue;
}
}

Буду благодарен, если кто-то покажет более эффективный метод поиска