За последние 24 часа нас посетили 17092 программиста и 1652 робота. Сейчас ищут 954 программиста ...

Написать программу.

Тема в разделе "Сделайте за меня", создана пользователем Reletivis, 9 июл 2017.

  1. Reletivis

    Reletivis Новичок

    С нами с:
    9 июл 2017
    Сообщения:
    5
    Симпатии:
    0
    При помощи array_map и анонимных функций написать программу, которая для массива автомобилей и их количества будет писать, сколько каких машин у вас в гараже, добавляя s в конце, если автомобилей несколько. Перечислять надо через запятую, но в конце написать and.
    --- Добавлено ---
    Пример массива:
    [Maserati] => 1
    [Lotus] => 4
    [Chevrolet] => 3
    [Bugatti] => 5
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Если хочешь, чтобы тема была перенесена обратно в раздел для новичков, необходимо показать свои наработки по вопросу, свои соображения, идеи, хотя бы. Тогда поможем, подскажем верное направление и тд. А до тех пор она остается тут и авось кто не поленится помочь.
     
  3. Reletivis

    Reletivis Новичок

    С нами с:
    9 июл 2017
    Сообщения:
    5
    Симпатии:
    0
    Прошу прощения. Меня вполне устроит нахождение в этом разделе. Просто сам по себе не понимаю анонимные функции. Сколько не читал, так и не проникся, а без них сделать могу.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Анонимная функция - это функция, объявляемая без сигнатуры.

    Вот пример кода:

    Код (PHP):
    1. <?php
    2.  
    3. function call($callable){ //объявляем функцию call
    4.     $callable(); //вызываем параметр $callable как если бы он сам был функцией.
    5. }
    6.  
    7. //Вызываем функцию call, передавая в качестве параметра анонимную функцию, выводящую текст "Works!"
    8. call(function(){
    9.     echo 'Works!';}
    10. );
    11.  
    12. // В итоге call примет анонимную функцию в параметр $callable и вызовет ее.
    13.  
    14. //На экране появится "Works!"
    --- Добавлено ---
    То есть, по сути, простыми словами, анонимная функция это функция, которую можно присвоить или передать как значение.
    --- Добавлено ---
    Вот тоже пример, но уже с присвоением переменной:
    PHP:
    1. <?php
    2. $callable = function(){
    3.     echo 'Works!';
    4. };
    5.  
    6. $callable();
     
  5. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    PHP:
    1. <?php
    2.    
    3. $cars = [
    4.     'Maserati' => 1,
    5.     'Lotus' => 4,
    6.     'Chevrolet' => 3,
    7.     'Bugatti' => 5,
    8. ];
    9.  
    10. $calc  = function () use ($cars) {
    11.     $txt = '';
    12.     $c = 1;
    13.     foreach($cars as $n => $v){
    14.         $isNums = $v > 1 ? "`s" : "";
    15.         $isComa = count($cars) > $c ? ", " : "";
    16.         $txt .= "{$v} - {$n}{$isNums}{$isComa}";
    17.         $c++;
    18.     }
    19.     if($txt != '') $txt .= " AND";
    20.     return $txt;
    21. };
    22.  
    23. echo $calc();
    так что ли?
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Путаешь анонимные функции и замыкания. В PHP это не одно и то же.
    Ну и array_map тут нет.
     
    Алекс8 нравится это.
  7. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    ох ёёё... точно..
     
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    тогда объясните пожалуйста))
    вот тут https://php.ru/manual/functions.anonymous.html написано
    я до этого момента думал это одно и тоже))
    анонимная функция в ПХП имеется виду функция которая вызывается как аргумент другой функции??

    а замыкание это то что я выше написал?
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Тут, походу, путаница терминологическая внутри самой документации. В общем, анонимная функция - это функция, являющаяся значением. Где-то такое называют термином "делегат", где-то "лямбда-функция". Можно как параметр передать, можно в массиве пачкой их хранить и вызывать в цикле как пулемет.

    Замыкание, именно методика, а не название объекта - это анонимная функция, наследующая и сохраняющая в себе скоуп или контекст места, где она была создана. В PHP это реализовано через костыль "use", дописываемый после объявления анонимной функции, в который передаются переменные, которые надо "сохранить".
    --- Добавлено ---
    Вообще, тут разрабы пыха намутили муть. Тот же use используется же еще и для импорта пространства имен классов, к примеру, но это уже совершенно другой use типа..
     
    Алекс8 нравится это.
  10. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    анонимная функция может вернуть значение только тогда когда она вызвана как call_back аргумент.. вроде так??
    потому что вот такие вот варианты ни в JS ни в PHP не проходят
    PHP:
    1. <script>
    2. var q = function(){
    3.     return 5;
    4. }
    5. console.log(q);
    6. </script>
    7. <?php
    8. echo function(){
    9.     return 5;
    10. };
    11. echo $q;
    12.  
    13. $q =  function(){
    14.     return 5;
    15. };
    16. echo $q;
     
    #10 Алекс8, 9 июл 2017
    Последнее редактирование: 9 июл 2017
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да ну, брось. Она может вернуть значение когда она будет вызвана. Не важно где и как.

    А ты ни в одном из вариантов не вызвал эту функцию. Ты просишь PHP распечатать тебе объект типа Closure, вместо того, чтобы попросить PHP выполнить этот объект как функцию.

    Вот так сработает:
    PHP:
    1. $q =  function(){
    2.     return 5;
    3. };
    4. echo $q();
     
  12. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да)) я это понимаю)) вызываем и получаем что то)) но сама функция не является значением) она является объектом)) а что бы она вернула значение - ее надо вызвать)
    --- Добавлено ---
    я имел ввиду вот это
    Код (Text):
    1. $arr = array_map(function($v){
    2.     return $v;
    3. }, $arr);
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну дык под капотом array_map точно так же берет функцию как переменную и вызывает ее как $callback(), передавая ей элемент массива, после чего обрабатывает ее возврат.

    Не важно как ты ее вызовешь, главное - вызвать. Не важно, коллбэк это или еще что. Просто так повелось, что в 95% случаев анонимные функции юзаются в коллбэках. Но это не мешает их юзать как-то иначе.
     
  14. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    да)) я именно это и имел ввиду))
    почитал чуть чуть)) про замыкание - это по сути просто вариант использования анонимной функции)) так что по сути одно и тоже)) просто замыкание позволяет сохранить состояние на момент его объявления)
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, это ключевой момент.
    --- Добавлено ---
    Не всякая анонимная функция - замыкание, но всякое замыкание - анонимная функция.
     
  16. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    давайте тогда вернемся к первому посту)) а как сюда прикрутить array_map?
    я что что ему тут места не вижу.. его то можно использовать - но тогда количество кода станет больше)
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Заменить им цикл в твоем решении.
    --- Добавлено ---
    А количество кода не мерило его качества, так-то. И стремиться к минимализму тут смысла особо нет. А то можно так наминималить, что потом вернешься к этому коду что-то поправить и ничерта в нем не поймешь из-за псевдооптимизаций ради экономии байтов.
     
  18. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    без цикла все равно не обойтись... array_map массив возвращает.. а тут текст нужен..
    --- Добавлено ---
    хотя нет)) можно))
    Код (Text):
    1. $cars = array_map(
    2.     function($k, $v){
    3.         $isNums = $v > 1 ? "`s" : "";
    4.         return "{$k}{$isNums} {$v}";
    5.     },
    6.     array_keys($cars),
    7.     array_values($cars)
    8. );
    9. echo implode(', ', $cars) . ' AND';
    --- Добавлено ---
    даже так красивее))
    PHP:
    1. $cars = array_map(
    2.     function($k, $v){
    3.         return $k . ($v > 1 ? '`s' : '') . $v;
    4.     },
    5.     array_keys($cars),
    6.     array_values($cars)
    7. );
    8. echo implode(', ', $cars) . ' AND';
     
  19. Reletivis

    Reletivis Новичок

    С нами с:
    9 июл 2017
    Сообщения:
    5
    Симпатии:
    0
    Всем спасибо за ответы! :)