Предположим, у меня есть следующий код:
function someFunc(){
// some other logic goes here
$return = [];
array_walk_recursive($matches, function($value, $key) use (&$return){
$return[] = $value;
});
return $return;
}
Обычно это все хорошо и денди. В основном то, что происходит, $matches
сплющивается, а затем возвращается.
Однако я хочу применить некоторую другую логику к каждому из $key => $value
пары в совпадениях, но логика, которую я хочу применить, не имеет места в текущей области видимости.
Конечно, приведенный выше код работает очень хорошо, я мог бы просто использовать foreach
применить логику после вызова функции, например:
function someOtherFunc(){
foreach(someFunc() as $key => $value){
// do stuff
}
}
Но ради аргументов давайте предположим, что вместо возвращения внутрь someFunc
я бы лучше yield
, так someFunc
вместо этого будет написано как:
function someFunc(){
// some other logic goes here
array_walk_recursive($matches, function($value, $key){
yield $value;
});
}
Это, конечно, не будет работать, так как теперь анонимная функция превращается в генератор, который в свою очередь используется array_walk_recursive
(это на самом деле загадка, почему это не выдает ошибку, я ожидал array_walk_recursive
жаловаться), что приводит к тому, что функция вызывающей стороны ничего не уступает, так как yield
удовлетворяется объемом анонимной функции.
В основном то, что я спрашиваю, возможно ли yield
$value
звонящему без прерывания текущего потока или какого-то странного хакерского кода?
Задача ещё не решена.
Других решений пока нет …