Почему не срабатывает код PHP из книги.На тему генераторов и то что их можно комбинировать

139
18 октября 2021, 23:10
        <? 
        // callback функция для кода 
        function select($arr, $callback){foreach($arr as $value){ 
        if($callback($value)) yield $value; }} 
        //Сам Код из учебника 
        $arr = [1, 2, 3, 4, 5, 6]; 
        $select = select($arr,function($e){ return $e % 2 == 0 ? true : false; }); 
        $collect = collect($select ,function($e){ return $e * $e; }); 
        foreach($collect as $val) echo($val); 
        //Выводил помимо ещё этой функцией: 
        $echo = $select; 
        foreach ($echo as $value) { 
        echo "arr : ".$value , PHP_EOL; 
        echo "возврат с функцией : ".$echo->current(),PHP_EOL; 
        }
        /*Стоит только выполнить ""Сам код из учебника"" выводит ошибку : 
    Fatal error: Uncaught Error: Call to undefined function collect() in C:\... Stack trace: #0 {main} thrown in C:\... on line . 
    Если в цикл foreach из ""Сам Код из учебника"" заменить на $select 
    результат будет : 2,4,6. то есть работает . 
    И с доп функцией : arr : 2 возврат с функцией : 2 arr : 4 возврат с функцией : 4 arr : 6 возврат с функцией : 6 тоже работает.
 Ожидается что результат будет 4 16 36 */
        ?>
Answer 1

Обычно в книгах, когда говорят о каком-то коде, то он может быть раскидан по всей главе. Порой даже переходить из одной главы в другую. Нужно это, чтобы книга не разбухала от исходного кода. Порой примеры могут достигать 10 страниц одного только кода и каждый раз их перекопировать, чтобы включить одну строчку, это расточительно.

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

<?php 
## Обработка каждого элемента массива
function collect($arr, $callback){
    foreach($arr as $value) (
        yield $callback($value);
    }
}
## Извлекаем только четные элементы
function select($arr, $callback){
    foreach($arr as $value) {
        if($callback($value)) yield $value; 
    }
}
...

По итогу, полный листинг должен выглядеть как-то так (весь код перекопирован из книги из одной подглавы):

<?php 
## Обработка каждого элемента массива
function collect($arr, $callback){
    foreach($arr as $value) {
        yield $callback($value);
    }
}
## Извлекаем только четные элементы
function select($arr, $callback){
    foreach($arr as $value) {
        if($callback($value)) yield $value; 
    }
}
## Извлекаем только нечетные элементы  
function reject($arr, $callback) {
    foreach($arr as $value){
        if(!$callback($value)) yield $value; 
    }
}
## Пример 1
$arr = [1, 2, 3, 4, 5, 6];
$collect = collect($arr, function($e) { return $e * $e; });
foreach($collect as $val) echo "$val "; 
## Пример 2
$arr = [1, 2, 3, 4, 5, 6];
$select = select($arr, function($e) { return $e % 2 == 0 ? true : false; });
foreach($select as $val) echo "$val "; 
## Пример 3
$arr = [1, 2, 3, 4, 5, 6];
$reject = reject($arr, function($e){ return $e % 2 == 0 ? true : false; });
foreach($reject as $val) echo "$val "; 
## Пример 4
$arr = [1, 2, 3, 4, 5, 6];
$select = select($arr, function($e){ return $e % 2 == 0 ? true : false; });
$collect= collect($select, function($e) {return $e * $e; });
foreach($collect as $val) echo "$val "; 
?>
READ ALSO
Как вывести параметры категории из бд

Как вывести параметры категории из бд

Из фронтенда решил перейти в бэкенд, подскажите пожалуйста, как происходит вывод данных выбранной категории, единственный момент который...

165
Call to undefined function mysqli_init() DEBIAN 9

Call to undefined function mysqli_init() DEBIAN 9

Пересмотрел кучу вопросов и попробовал кучу решений, но проблема все равно осталасьРасширение php-mysqlnd тоже установлено

150
setcookie только для index.php

setcookie только для index.php

Как указать в setcookie, что куки должны быть видны только с одной страницы сайта, если эта страница indexphp?

73
Вызов метода класса

Вызов метода класса

Есть 3 файлаindex

81