iterator_apply

(PHP 5 >= 5.1.0)

iterator_applyВызывает функцию для каждого элемента в итераторе

Описание

int iterator_apply ( Traversable $iterator , callable $function [, array $args ] )

Вызывает функцию для каждого элемента в итераторе.

Список параметров

iterator

Класс для перебора.

function

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

Замечание: Функция должна возвращать TRUE для того, чтобы продолжать процесс итерации над iterator.

args

Аргументы для передачи в функцию обратного вызова.

Возвращаемые значения

Returns the iteration count.

Примеры

Пример #1 Пример использования iterator_apply()

<?php
function print_caps(Iterator $iterator) {
    echo 
strtoupper($iterator->current()) . "\n";
    return 
TRUE;
}

$it = new ArrayIterator(array("Apples""Bananas""Cherries"));
iterator_apply($it"print_caps", array($it));
?>

Результат выполнения данного примера:

APPLES
BANANAS
CHERRIES

Смотрите также

  • array_walk() - Применяет пользовательскую функцию к каждому элементу массива

Коментарии

$args is an array and each of its elements are passed to the callback as separate arguments.

so this is the right way to get args:

<?php
$ai 
= new ArrayIterator(range(02));

iterator_apply($ai, function() {
   
var_dump(func_get_args());     // use this func
   
return true;
}, array(
12));
?>

output: 

array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}

--------------------------------------------------
or list each args:

<?php
$ai 
= new ArrayIterator(range(02));

iterator_apply($ai, function($arg1$arg2$arg3) {
   
var_dump([$arg1$arg2$arg3]);
    return 
true;
}, array(
12));
?>

same output.
2017-11-22 08:47:21
http://php5.kiev.ua/manual/ru/function.iterator-apply.html
Be aware of the proper methods to iterate the specific Iterator you are consuming, as the implementation of the method could vary its behaviour.

For example, unlike the ArrayIterator, you can't iterate on a SplDoubleLinkedList with current() without using next() on every iteration (and then, only would iterate if you return true at the end of the callable. It is far easier then with LinkedLists use a while($it->valid()) { $it->current(); $it->next(); }

Let's see:

<?php

$ll 
= new \SplDoublyLinkedList();

$ll->push('ze');
$ll->push('ome');
$ll->push('yei');
$ll->push('nahui');

$ll->rewind();

$iterations_done iterator_apply($ll, function(Iterator $it) {

    echo 
implode("\t=>", [
       
$it->key(),
       
$it->current(),
       
ucfirst($it->current())
    ]),
"\n";
   
    return 
true;

}, array(
$ll));

echo 
"Did iterate {$iterations_done} times \n";

$ll->rewind();

$iterations_done iterator_apply($ll, function(Iterator $it) {

    echo 
implode("\t=>", [
       
$it->key(),
       
$it->current(),
       
ucfirst($it->current())
    ]),
"\n";
   
   
$it->next();
   
    return 
true;

}, array(
$ll));

echo 
"Did iterate {$iterations_done} times \n";

$ll->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO SplDoublyLinkedList::IT_MODE_DELETE);

var_dump($ll->count());

foreach(
$ll as $key => $val) {
    echo 
"{$key}\t",ucfirst($val),"\n";
}

var_dump($ll->count());
?>

Output:

0    =>ze    =>Ze
0    =>ze    =>Ze
0    =>ze    =>Ze
0    =>ze    =>Ze
Did iterate 4 times 
0    =>ze    =>Ze
1    =>ome    =>Ome
2    =>yei    =>Yei
3    =>nahui    =>Nahui
Did iterate 4 times 
int(4)
0    Ze
0    Ome
0    Yei
0    Nahui
int(0)
2018-08-19 22:35:16
http://php5.kiev.ua/manual/ru/function.iterator-apply.html
Each of the arguments required by the function, must be in the array supplied in the third argument to iterator_apply. You can use references too. Example:

<?php

function translate_to(string $target_languageIterator $words, array $dictionaries) {
   
   
$language ucfirst($target_language);
   
$dictionary $dictionaries[$target_language] ?? 'not found';
   
    if (
$dictionary === 'not found') {
        echo 
"Not found dictionary for {$language}\n";
        return;
    }
   
    echo 
"English words translated to {$language}\n";
   
   
$not_found = [];
   
   
iterator_apply($words, function($words$dictionary, &$not_found){
   
       
$english_word $words->current();
   
       
$translated_word $dictionary[$english_word] ?? '';
   
        if (
$translated_word !== '') {
            echo 
"{$english_word} translates to {$translated_word}\n";
        } else {
           
$not_found[] = $english_word;
        }

        return 
true;
   
    }, array(
$words$dictionary, &$not_found));
   
    echo 
"\nNot found words:\n" implode("\n"$not_found) . "\n";
}

$dictionaries = [
   
'nahuatl' => [
       
'one' => 'Ze',
       
'two' => 'Ome',
       
'three' => 'Yei',
       
'four' => 'Nahui',
    ],
];

$iterator = new \ArrayIterator(array('one''two''three''four''gasoil'));

translate_to('nahuatl'$iterator$dictionaries);
?>

English words translated to Nahuatl
one translates to Ze
two translates to Ome
three translates to Yei
four translates to Nahui

Not found words:
gasoil
2018-08-19 23:43:23
http://php5.kiev.ua/manual/ru/function.iterator-apply.html

    Поддержать сайт на родительском проекте КГБ