PHP

СРОЧНО! ЧТО ВЫПОЛНЯЕТ ЭТОТ PHP КОД?

Короче, нам задали рекурсивную функцию. Я вообще не понимаю, нах... начерта мне этот $level. Как он вообще может влиять на значение $array? Он вообще что-то значит. Плюс как меняются и подсчитываются значения переменных $count и $array. ЧТО ЭТООО?
function sum($array, $level = 0) {
static $count; //$count = null (0)
static $items; //$items = null (0)
if (is_array($array)) {
$level++; //level = 0, level = 1.
foreach ($array as $element);
sum($element, $level);
}
else {
$count++;
$items += $array;
}
return array('count' => $count, 'items' => $items);
}
$result = sum($array);
print_r($result);
NM
Niki12 Moroz
343
В данном случае $level действительно ни на что не влияет и совершенно не нужна (она необходима только в том случае, когда нужно проверять уровень вложенности рекурсии). Эталонный говонокод, написанный полным ламером.

$count и $item - static. Т. е. они сохраняют свои значения между вызовами sum. Потому рассматривай их как глобальные переменные, видимые только внутри функции sum.

Такое ощущение, что кто-то бездумно скопипастил кусок кода, а потом крайне тупо изменил его под более простую задачу - вообще не разбираясь в смысле конструкций исходного кода.

function sum($data) {
if (is_array($data)) {
$result = ['count' => 0, 'items' => 0];
foreach($data as $row) {
$sub = sum($row);
$result['count'] += $sub['count'];
$result['items'] += $sub['items'];
}
return $result;
} else {
return ['count' => 1, 'items' => $data];
}
}
Максим Кононов
Максим Кононов
70 009
Лучший ответ
Niki12 Moroz Вы просто рафаело вместо тысячи слов! Спасибо огромное!
Тяжелый случай.
Если не заметил у тебя функция вызывает саму себя, ну или должна была делать это.
$level - это уровень вложенности запросов.

Но, учитывая, что в данном случае $element не является массивом,
то функция ни разу сама себя не вызовет.
Или часть кода пропущена, или не знаю, что это должно было делать...
В данном случае просто выдаст
Array
(
[count] => 1
[items] => 0
)

И вот это, что должно было делать не понятно, подозреваю, что тут точка с запятой не к месту.
foreach ($array as $element);

А $level скорее всего планировалось использовать для ограничения кол-ва уровней вложенности вызова функции.