PHP 7.1.21 Released

iterator_apply

(PHP 5 >= 5.1.0, PHP 7)

iterator_applyCall a function for every element in an iterator

Description

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

Calls a function for every element in an iterator.

Parameters

iterator

The iterator object to iterate over.

function

The callback function to call on every element. This function only receives the given args, so it is nullary by default. If count($args) === 3, for instance, the callback function is ternary.

Note: The function must return TRUE in order to continue iterating over the iterator.

args

An array of arguments; each element of args is passed to the callback function as separate argument.

Return Values

Returns the iteration count.

Examples

Example #1 iterator_apply() example

<?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));
?>

The above example will output:

APPLES
BANANAS
CHERRIES

See Also

  • array_walk() - Apply a user supplied function to every member of an array

add a note add a note

User Contributed Notes 2 notes

up
0
tezcatl at fedoraproject dot org
20 minutes ago
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)
up
-1
ycgambo at outlook dot com
8 months ago
$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(0, 2));

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

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(0, 2));

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

same output.
To Top