0 / 0 / 0
Регистрация: 23.12.2016
Сообщений: 20
1

Генераторы в PHP

17.05.2018, 23:06. Показов 3615. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
PHP только начинаю изучать и вот появилась задача. Как это правильно реализовать, не представляю(


1 Создайте анонимную функцию и поместите её в переменную. Функция должна принимать массив и возвращать среднее значение всех элементов.
2 Создайте функцию-генератор, принимающую двумерный массив и функцию. Эта функция на каждой итерации должна возвращать среднее значение текущего массива.
3 Создайте двумерный массив из чисел.
4 С помощью foreach выведите все средние значения элементов двумерного массива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2018, 23:06
Ответы с готовыми решениями:

Различные генераторы различных документов
Всем доброе утро! Возникла необходимость генерировать. К сожалению, генерировать нужно всё и...

Функции генераторы и выражения генераторы
Всем доброго времени суток, изучаю такую тему как Функции-генераторы и появился вопрос, для чего...

Электронные генераторы
Для схемы автогенератора гармонических колебаний, определить коэффициент передачи цепи обратной...

Генераторы документаций
Какой из генераторов документаций мне лучше для C# выбрать (по критерию: большие возможности,...

26
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.05.2018, 23:08 2
Цитата Сообщение от MailaGoogle Посмотреть сообщение
Как это правильно реализовать, не представляю(
С каким из пунктов возникли затруднения?
0
0 / 0 / 0
Регистрация: 23.12.2016
Сообщений: 20
17.05.2018, 23:14  [ТС] 3
Jewbacabra, Вот примерно реализовать 3 и 4 п. ещё понимаю как:

PHP
1
2
3
4
5
6
7
8
9
  $array = array(array(11,12,13, ..
$m = 0; 
$c = 0; 
foreach ($array as $e) { 
    $c += count($e); 
    $m += array_sum($e); 
} 
$m /= $c; 
echo "result: $m\n";

С остальным сложно разобраться..
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.05.2018, 23:18 4
Цитата Сообщение от MailaGoogle Посмотреть сообщение
Вот как примерно как реализовать 3 и 4 п. понимаю так:
В п.4 сказано "выведите все средние значения элементов двумерного массива". Т.е среднее значение каждого подмассива.
И у меня сложилось впечатление, что реализовать 4 пункт нужно используя результаты 1 и 2, и начинать нужно с них.
0
0 / 0 / 0
Регистрация: 23.12.2016
Сообщений: 20
17.05.2018, 23:55  [ТС] 5
Jewbacabra, тоже так думаю, но как связать пока не знаю.

1 п.
PHP
1
2
3
4
5
$ANONYMOUS = function ($ARRAY) {
    return array_sum($ARRAY)/count($ARRAY);
}
$INPUT = array(1, 2, 3, 4, 5);
var_dump($ANONYMOUS($INPUT));
2 функция генератор

PHP
1
2
3
4
5
function myGenerator($ARRAY, $FUNC) {
    foreach($ARRAY as $value) {
        yield $FUNC($value);
    }
}
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.05.2018, 00:47 6
MailaGoogle, ну практически готово. Теперь нужно в функцию генератор передать двумерный массив и функцию вычисления среднего. Результат проитерировать с помощью foreach, выводя значение на каждой итерации
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
18.05.2018, 13:48 7
1.
PHP
1
2
3
4
5
$var = function (...$var) {
    return array_sum(...$var) / count(...$var);
};
$arr = [10,20,30,40,50];
echo $var($arr).'<br/>';
3,4
PHP
1
2
3
4
5
6
7
8
9
$count = 0; $zr = 0;
for($i=1;$i<10;$i++) {
    $arr = array([$i]);
    foreach($arr as $list) {
        $count += count($list);
        $zr += array_sum($list);
    }
}
echo $zr / $count;

2 вопрос не понял какую функцию передать, пользовательскую или какую?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.05.2018, 15:32 8
maxoun, п 4 нужно реализовать используя наработки п 1 и 2. И оператор ... тут неуместен
0
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
18.05.2018, 16:34 9
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И оператор ... тут неуместен
Ну и почему же?? вдруг пользователь решил передать 100 значений массива?
Цитата Сообщение от Jewbacabra Посмотреть сообщение
п 4 нужно реализовать используя наработки п 1 и 2
Я нигде не увидел что п 4 нужно реализовать с помощью 1 и 2.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.05.2018, 21:57 10
Цитата Сообщение от maxoun Посмотреть сообщение
Ну и почему же?? вдруг пользователь решил передать 100 значений массива?
Хоть 1 000 000. На то он и массив. Но один массив. Если 1 аргумент раскрыть через оператор ..., то 1 аргумент и останется Да и на 9 символов больше получается. https://ideone.com/75e3bC
Цитата Сообщение от maxoun Посмотреть сообщение
Я нигде не увидел что п 4 нужно реализовать с помощью 1 и 2.
Это вытекает из логики задания. Лирическое отступление:
Математику и физику была предложена одна и та же задача: вскипятить чайник. Даны подсобные инструменты: плита, чайник, водопроводный кран с водой, спички. Оба поочередно наливают воду в чайник, включают газ, зажигают его и ставят чайник на огонь. Затем задачу упростили: предложен чайник, наполненный водой и плита с горящим газом. Цель та же — вскипятить воду. Физик ставит чайник на огонь. Математик выливает из чайника воду, выключает газ и говорит: "Задача свелась к предыдущей."
Так зачем выливать воду (решение первой задачи) и выключать газ (решение второй задачи), когда осталось поставить чайник на огонь (использовать 2 готовые функции)?

Добавлено через 7 минут
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// п.1
$meanValueFunc = function (array $arr): float {
    return \array_sum($arr) / \count($arr);
};
 
// п.2
function arrayCallbackGenerator(array $arr, callable $callback): \Generator {
    foreach ($arr as $a) {
        yield $callback($a);
    }
}
 
// п.3
$arr = [
    [1, 2, 3],
    [10, 20, 30, 40, 50],
];
 
// п.4
foreach (arrayCallbackGenerator($arr, $meanValueFunc) as $mean) {
    echo "$mean<br>";
}
https://ideone.com/1CwqRH
2
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
20.05.2018, 15:16 11
мда
0
0 / 0 / 0
Регистрация: 23.12.2016
Сообщений: 20
20.05.2018, 23:06  [ТС] 12
Jewbacabra,

С помощью callable $callback не совсем понятно(

У меня вариант такой получился:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ANONYMOUS = function ($ARRAY) {
    return array_sum($ARRAY)/count($ARRAY);
}
$INPUT = array(1, 2, 3, 4, 5);
var_dump($ANONYMOUS($INPUT));
 
//2 Создайте функцию-генератор, принимающую двумерный массив и функцию. Эта функция на каждой итерации должна возвращать среднее значение текущего массива.
function myGenerator($ARRAY, $FUNC) {
    foreach($ARRAY as $value) {
        yield $FUNC($value);
    }
}
 
$MAS = array(
    array(1, 2, 3),
    array(4, 5, 6)
    );
 
foreach(myGenerator($MAS, function($ARRAY) { return array_sum($ARRAY)/count($ARRAY); }) as $value) {
 var_dump($value);
}
 
//Создайте двумерный массив из чисел.
$ARRAY = array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9)
    );
 
    //С помощью foreach выведите все средние значения элементов двумерного массива.
$ARRAY = array(
    array(1, 2, 3),
    array(4, 5, 6),
    array(7, 8, 9)
    );
 
foreach ($ARRAY as $value) {
    var_dump(array_sum($value)/count($value));
}
0
0 / 0 / 0
Регистрация: 08.07.2018
Сообщений: 1
05.11.2018, 15:55 13
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// анонимная функция
$anonymF = function ($arr) {
            $sum = 0;
            for ( $i = 0; $i < count($arr); $i++ ) { // посчитать сумму элементов массива
                $sum += $arr[$i] / count($arr);      // можно через array_sum
            }
            return $sum;
        };
 
// двухмерный массив
        $arr2 = [
            [1,3,4,5],
            [4,6,7,1],
            [4,4,6,9],
            [1,2,9,8]
        ];
 
// генератор
        function generator($array, $func) {
            foreach ($array as $value) {
                echo $func($value).'<br>';
            }
        }
 
// вызов генератора
        echo generator($arr2, $anonymF);
0
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
05.11.2018, 17:03 14
DarkStyleee
Кликните здесь для просмотра всего текста

Не по теме:

Ваш генератор на самом деле не совсем генератор, я бы даже сказал - совсем не генератор



Добавлено через 50 секунд
Jewbacabra, +1

Добавлено через 1 минуту
Jewbacabra, Вы не могли бы "на пальцах" объяснить, в чём существенное преимущество этой записи
PHP
1
return \array_sum($arr) / \count($arr);
в отличии от этой:
PHP
1
return array_sum($arr) / count($arr);
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.11.2018, 17:18 15
Цитата Сообщение от VNIIAEN Посмотреть сообщение
Вы не могли бы "на пальцах" объяснить, в чём существенное преимущество этой записи
В глобальном пространстве имен преимуществ нет.
В остальных случаях на 1 опкод меньше в скомпилированном коде. Щас уже статьи не найду, но читал что symfony таким образом ускорили на что-то около 5%. Мелочь конечно, но все же. И есть вероятность, что в новых версиях php обращение к глобальному пространству имен без явного указания будет объявлено устаревшим.
Можно в начале файла писать use function array_sum;
1
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
05.11.2018, 17:23 16
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можно в начале файла писать use function array_sum;
А со второй функцией тогда так же можно действовать?
PHP
1
use function count;
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
05.11.2018, 17:40 17
Цитата Сообщение от VNIIAEN Посмотреть сообщение
А со второй функцией тогда так же можно действовать?
да.
0
-9 / 0 / 0
Регистрация: 14.11.2023
Сообщений: 5
15.11.2023, 12:21 18
Тут всё намного проще и понятнее. Вот зачем нужно воду мутить и что-то изобретать с нуля до гуру.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
$anonim = function ($arr) {
    $sumAll = 0;
    foreach ($arr as $value) :
        $sumAll += $value;
    endforeach;
    return $sumAll / count($arr);
};
 
function MyGeneration($arr, $callback)
{
    $sumAll = 0;
    $i = 0;
    foreach ($arr as $value) :
        foreach ($value as $v) :
            $sumAll += $v;
        endforeach;
        $i += count($value);
        yield $callback($value);
    endforeach;
    yield $sumAll / $i;
}
 
$twoArray = [
    [1, 2, 5, 4, 7],
    [3, 5, 1, 4, 7],
    [9, 8, 5, 0, 2]
];
 
foreach (MyGeneration($twoArray, $anonim) as $item) {
    echo $item;
    echo '<br />';
}
 
?>
Первые три значения при выводе - это средние значения элементов каждого подмассива. Последнее значение при выводе в браузере: 4.2 - это среднее значение абсолютно всех элементов в двумерном массиве
0
2227 / 1274 / 609
Регистрация: 23.08.2015
Сообщений: 3,222
24.11.2023, 13:01 19
Цитата Сообщение от Lindholm Посмотреть сообщение
Последнее значение при выводе в браузере: 4.2 - это среднее значение абсолютно всех элементов в двумерном массиве
Этого не требуется в задаче.
0
-9 / 0 / 0
Регистрация: 14.11.2023
Сообщений: 5
24.11.2023, 16:57 20
Ты в этом уверен? А чо нет-то? Может всё таки требуется?
Возьми да выведи это среднее значение абсолютно всех элементов, вдруг преподаватель по 4-му этапу захочет увидеть именно это? По крайней мере, ориентируясь на свой опыт, я дал определённый совет на всякий пожарный
0
24.11.2023, 16:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2023, 16:57
Помогаю со студенческими работами здесь

Генераторы списков
Небольшой вопрос по теме. Есть код. bookdirs = bs = bs = import os bs = fs = for b in...

Генераторы в InterBase
Доброго времени суток. Есть таблица &quot;Bill&quot; в ней есть генератор для первичного ключа. Можно ли...

Генераторы текстов
Для начала скажу, что такие сателиты пригодятся только для продажи ссылок. Как насчёт рерайта...

Генераторы на python
Написать генератор, возвращающий сначала все числа из единственного аргумента-кортежа (в порядке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru