iterator_apply

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_applyAppelle une fonction pour tous les éléments d'un itérateur

Description

iterator_apply(Traversable $iterator, callable $callback, ?array $args = null): int

Appelle une fonction pour tous les éléments d'un itérateur.

Liste de paramètres

iterator

L'object iterator à itérer.

callback

La fonction de rappel à appeler à chaque élément. Cette fonction ne reçoit que les arguments args donnés, elle est donc nullaire par défault. Si count($args) === 3, par exemple, la fonction est ternaire.

Note: La fonction doit retourner true afin de continuer d'itérer à travers l'itérateur nommé par le paramètre iterator.

args

Un tableau array d'arguments; chaque élément de args est passé à la fonction de rappel callback comme argument séparé.

Valeurs de retour

Retourne le nombre d'itération.

Exemples

Exemple #1 Exemple avec 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));
?>

L'exemple ci-dessus va afficher :

APPLES
BANANAS
CHERRIES

Voir aussi

  • array_walk() - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

add a note add a note

User Contributed Notes 3 notes

up
2
tezcatl at fedoraproject dot org
6 years ago
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_language, Iterator $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
up
1
tezcatl at fedoraproject dot org
6 years 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
-2
ycgambo at outlook dot com
6 years 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