Вопрос пользователя Kirill Svirid в уроке «Агрегация (reduce)», курс «PHP: Функции»

Kirill Svirid

Просидел.. ., попыхтел.. .,просматривал и разбирал примеры из теории, иногда запускал некоторые из примеров в repl.it, где-то для меня было так удобнее и в чём-то помогало. Как в некоторых случаях помогал просмотр файла с тестами, там бывает можно натолкнуться на мысль о решении, каким оно должно выглядеть, ну это к примеру.

Пробовал и еще раз пробовал, вникал и наконец-то решил. Конечно, не так элегантно и лаконично как решение учителя. Решение учителя включает в себя всё трио, пройденных трёх функций, красиво применена и array_filter, и array_map в итоге возврат нужного результата из array_reduce, просто красота! Эх.. . Я же в своём решении всё "скармил" одной мощной array_reduce, понятно, что внутри получилось много проверок - if-ов, возможно и "лишних" присвоений, не очень красивых retur-ов :) . Вобщем такой олдскульный хардкор:)

Когда начинаешь понемногу вникать и доходить до принципов устройства и работы этих чУдесных:) функций: array_map, array_filter, array_reduce , то раскладывается всё по-полочкам. По-началу пытаешься как бы "уловить", где там цикл "зашит", потому что привык уже и чувствуешь что вот он работает, а его явно не видно:) и как-будто чего-то не хватает:).

В array_reduce не совсем привычны действия с аккумулятором, вроде бы прочитаешь теорию и просмотришь примеры и кажется, да и понятно, в общем и в целом, но потом на практике есть свои моменты, нюансы и нужно разбираться, как говорится: "Мелочи - это не пустяки! И мелочи в мелочах - вовсе не мелочи!". Это особенно применимо к программированию!

[?] Такой вот вопрос с аккумулирующим в себе итоговое значение, как взаимосвязаны в решении учителя массив $acc, который подаётся первым аргументом в нашу анонимную функцию и 3-тий параметр - пустой массив [] в array_reduce ? Пустой массив $acc , наполняется в цикле внутри анонимной функции с учётом всех тех условий, прописанных в теле функции. То есть каждую итерацию идёт заполнение изначально пустого - $acc , по окончанию цикла, далее наполненный $acc возвращается уже из нашей анонимной функции - return $acc , то есть вот он у нас собственно есть return результирующего нужного нам массива, а какую роль играет тут 3-тий аргумент array_reduce? Это просто показать, что возвращаться будет массив - [] ? Ведь по сути агрегируется $acc , а как $acc связан с 3-им аргументом - []. Вобщем не совсем понятна что-ли роль этого 3-его аргумента агрегатора в array_reduce и вообще это похоже как итоговый(2-ой возврат) из функции - вернули наш результирующий массив $acc, к тому еще из array_reduce вернули 3-тий аргумент - [] ? Представляется что-то такое.)

// removed

2 0

Сергей К.

Кирилл приветствую! array_map, array_filter и array_reduce - это столпы функционального программирования. Необходимо уточнить логику работы array_reduce.

Третий аргумент array_reduce - это начальное значение аккумулятора. Он используется при применении функции на первом элементе массива. Здесь мы обрабатываем аккумулятор и прокидываем его дальше. Т.е. на каждом очередном элементе массива мы имеем дело с обновлённым аккумулятором.

return $acc; в теле функции-обработчика завершает обработку очередного элемента, но не всего array_reduce. Запомните, возвращать аккумулятор надо при каждом проходе, даже если тот не менялся.

Результирующий массив будет возвращён после вызова обработчика на последнем элементе. Кстати, накопление значения $acc можно отследить, если вывести его на печать перед возвратом.

1

Kirill Svirid

Сергей К., здравствуйте! Спасибо за пояснения!

0

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Похожие вопросы

Иван Гончаров 23 декабря 2020 →

Доброго времени года! Застрял на этапе преобразования ключей массива. Направьте, пожалуйста. Ревью https://...

Николай Мальчиков 10 декабря 2020 →

Добрый вечер, не очень понимаю где применять strtotime и подсчет count enter link description here (https:/...

Александр Рысаев 22 ноября 2020 →

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

Динара 08 ноября 2020 →

Здравствуйте! Решение не проходит, вот ревью - https://ru.hexlet.io/codereviews/337617https://ru.hexlet.io/...

Сергей Пилипенко 28 августа 2020 →

Странно, у вас на ютуб канале нашел готовые видео ко многим урокам. Было бы круто, как в курсе по "http" те...