При помощи array_map и анонимных функций написать программу, которая для массива автомобилей и их количества будет писать, сколько каких машин у вас в гараже, добавляя s в конце, если автомобилей несколько. Перечислять надо через запятую, но в конце написать and. --- Добавлено --- Пример массива: [Maserati] => 1 [Lotus] => 4 [Chevrolet] => 3 [Bugatti] => 5
Если хочешь, чтобы тема была перенесена обратно в раздел для новичков, необходимо показать свои наработки по вопросу, свои соображения, идеи, хотя бы. Тогда поможем, подскажем верное направление и тд. А до тех пор она остается тут и авось кто не поленится помочь.
Прошу прощения. Меня вполне устроит нахождение в этом разделе. Просто сам по себе не понимаю анонимные функции. Сколько не читал, так и не проникся, а без них сделать могу.
Анонимная функция - это функция, объявляемая без сигнатуры. Вот пример кода: Код (PHP): <?php function call($callable){ //объявляем функцию call $callable(); //вызываем параметр $callable как если бы он сам был функцией. } //Вызываем функцию call, передавая в качестве параметра анонимную функцию, выводящую текст "Works!" call(function(){ echo 'Works!';} ); // В итоге call примет анонимную функцию в параметр $callable и вызовет ее. //На экране появится "Works!" --- Добавлено --- То есть, по сути, простыми словами, анонимная функция это функция, которую можно присвоить или передать как значение. --- Добавлено --- Вот тоже пример, но уже с присвоением переменной: PHP: <?php $callable = function(){ echo 'Works!'; }; $callable();
PHP: <?php $cars = [ 'Maserati' => 1, 'Lotus' => 4, 'Chevrolet' => 3, 'Bugatti' => 5, ]; $calc = function () use ($cars) { $txt = ''; $c = 1; foreach($cars as $n => $v){ $isNums = $v > 1 ? "`s" : ""; $isComa = count($cars) > $c ? ", " : ""; $txt .= "{$v} - {$n}{$isNums}{$isComa}"; $c++; } if($txt != '') $txt .= " AND"; return $txt; }; echo $calc(); так что ли?
тогда объясните пожалуйста)) вот тут https://php.ru/manual/functions.anonymous.html написано я до этого момента думал это одно и тоже)) анонимная функция в ПХП имеется виду функция которая вызывается как аргумент другой функции?? а замыкание это то что я выше написал?
Тут, походу, путаница терминологическая внутри самой документации. В общем, анонимная функция - это функция, являющаяся значением. Где-то такое называют термином "делегат", где-то "лямбда-функция". Можно как параметр передать, можно в массиве пачкой их хранить и вызывать в цикле как пулемет. Замыкание, именно методика, а не название объекта - это анонимная функция, наследующая и сохраняющая в себе скоуп или контекст места, где она была создана. В PHP это реализовано через костыль "use", дописываемый после объявления анонимной функции, в который передаются переменные, которые надо "сохранить". --- Добавлено --- Вообще, тут разрабы пыха намутили муть. Тот же use используется же еще и для импорта пространства имен классов, к примеру, но это уже совершенно другой use типа..
анонимная функция может вернуть значение только тогда когда она вызвана как call_back аргумент.. вроде так?? потому что вот такие вот варианты ни в JS ни в PHP не проходят PHP: <script> var q = function(){ return 5; } console.log(q); </script> <?php echo function(){ return 5; }; echo $q; $q = function(){ return 5; }; echo $q;
Да ну, брось. Она может вернуть значение когда она будет вызвана. Не важно где и как. А ты ни в одном из вариантов не вызвал эту функцию. Ты просишь PHP распечатать тебе объект типа Closure, вместо того, чтобы попросить PHP выполнить этот объект как функцию. Вот так сработает: PHP: $q = function(){ return 5; }; echo $q();
да)) я это понимаю)) вызываем и получаем что то)) но сама функция не является значением) она является объектом)) а что бы она вернула значение - ее надо вызвать) --- Добавлено --- я имел ввиду вот это Код (Text): $arr = array_map(function($v){ return $v; }, $arr);
Ну дык под капотом array_map точно так же берет функцию как переменную и вызывает ее как $callback(), передавая ей элемент массива, после чего обрабатывает ее возврат. Не важно как ты ее вызовешь, главное - вызвать. Не важно, коллбэк это или еще что. Просто так повелось, что в 95% случаев анонимные функции юзаются в коллбэках. Но это не мешает их юзать как-то иначе.
да)) я именно это и имел ввиду)) почитал чуть чуть)) про замыкание - это по сути просто вариант использования анонимной функции)) так что по сути одно и тоже)) просто замыкание позволяет сохранить состояние на момент его объявления)
Да, это ключевой момент. --- Добавлено --- Не всякая анонимная функция - замыкание, но всякое замыкание - анонимная функция.
давайте тогда вернемся к первому посту)) а как сюда прикрутить array_map? я что что ему тут места не вижу.. его то можно использовать - но тогда количество кода станет больше)
Заменить им цикл в твоем решении. --- Добавлено --- А количество кода не мерило его качества, так-то. И стремиться к минимализму тут смысла особо нет. А то можно так наминималить, что потом вернешься к этому коду что-то поправить и ничерта в нем не поймешь из-за псевдооптимизаций ради экономии байтов.
без цикла все равно не обойтись... array_map массив возвращает.. а тут текст нужен.. --- Добавлено --- хотя нет)) можно)) Код (Text): $cars = array_map( function($k, $v){ $isNums = $v > 1 ? "`s" : ""; return "{$k}{$isNums} {$v}"; }, array_keys($cars), array_values($cars) ); echo implode(', ', $cars) . ' AND'; --- Добавлено --- даже так красивее)) PHP: $cars = array_map( function($k, $v){ return $k . ($v > 1 ? '`s' : '') . $v; }, array_keys($cars), array_values($cars) ); echo implode(', ', $cars) . ' AND';