PHP 7.4.0RC6 Released!

La classe ArrayIterator

(PHP 5, PHP 7)

Introduction

Cet itérateur permet de réinitialiser et de modifier les valeurs et les clés lors de l'itération de tableaux et d'objets.

Lorsque vous voulez passer en revue le même tableau plusieurs fois, vous devez instancier ArrayObject et le laisser créer les objets ArrayIterator qui s'y réfèrent, soit en utilisant l'instruction foreach, soit en appelant la méthode getIterator() manuellement.

Synopsis de la classe

ArrayIterator implements ArrayAccess , SeekableIterator , Countable , Serializable {
/* Constantes */
const integer STD_PROP_LIST = 1 ;
const integer ARRAY_AS_PROPS = 2 ;
/* Méthodes */
public append ( mixed $value ) : void
public asort ( void ) : void
public __construct ([ mixed $array = array() [, int $flags = 0 ]] )
public count ( void ) : int
public current ( void ) : mixed
public getArrayCopy ( void ) : array
public getFlags ( void ) : int
public key ( void ) : mixed
public ksort ( void ) : void
public natcasesort ( void ) : void
public natsort ( void ) : void
public next ( void ) : void
public offsetExists ( mixed $index ) : bool
public offsetGet ( mixed $index ) : mixed
public offsetSet ( mixed $index , mixed $newval ) : void
public offsetUnset ( mixed $index ) : void
public rewind ( void ) : void
public seek ( int $position ) : void
public serialize ( void ) : string
public setFlags ( string $flags ) : void
public uasort ( callable $cmp_function ) : void
public uksort ( callable $cmp_function ) : void
public unserialize ( string $serialized ) : void
public valid ( void ) : bool
}

Constantes pré-définies

Drapeaux ArrayIterator

ArrayIterator::STD_PROP_LIST

Les propriétés de l'object conservent leurs fonctionalités normales lorsqu'ils sont accédés en tant que liste (var_dump, foreach, etc.).

ArrayIterator::ARRAY_AS_PROPS

Les entrées peuvent être accédé comme des propriétés (lecture et écriture).

Sommaire

add a note add a note

User Contributed Notes 5 notes

up
33
Venelin Vulkov
11 years ago
Another fine Iterator from php . You can use it especially when you have to iterate over objects

<?php
$fruits
= array(
   
"apple" => "yummy",
   
"orange" => "ah ya, nice",
   
"grape" => "wow, I love it!",
   
"plum" => "nah, not me"
);
$obj = new ArrayObject( $fruits );
$it = $obj->getIterator();

// How many items are we iterating over?

echo "Iterating over: " . $obj->count() . " values\n";

// Iterate over the values in the ArrayObject:
while( $it->valid() )
{
    echo
$it->key() . "=" . $it->current() . "\n";
   
$it->next();
}

// The good thing here is that it can be iterated with foreach loop

foreach ($it as $key=>$val)
echo
$key.":".$val."\n";

/* Outputs something like */

Iterating over: 4 values
apple
=yummy
orange
=ah ya, nice
grape
=wow, I love it!
plum=nah, not me

?>

Regards.
up
21
Relakuyae
8 years ago
Need a callback on an iterated value, but don't have PHP 5.4+?  This makes is stupid easy:

<?php
class ArrayCallbackIterator extends ArrayIterator {
  private
$callback;
  public function
__construct($value, $callback) {
   
parent::__construct($value);
   
$this->callback = $callback;
  }

  public function
current() {
   
$value = parent::current();
    return
call_user_func($this->callback, $value);
  }
}
?>

You can use it pretty much exactly as the Array Iterator:

<?php
$iterator1
= new ArrayCallbackIterator($valueList, "callback_function");
$iterator2 = new ArrayCallbackIterator($valueList, array($object, "callback_class_method"));
?>
up
8
Sean Burlington
10 years ago
and to iterate recursively use the (sparsely documented)  RecursiveArrayIterator

<?php

$fruits
= array(
               
"apple" => "yummy",
               
"orange" => "ah ya, nice",
               
"grape" => "wow, I love it!",
                
"plum" => "nah, not me"
               
);

$veg = array("potato" => "chips", "carrot" => "soup");
$grocery = array($fruits, $veg);
$obj = new ArrayObject( $grocery );

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($grocery));

foreach (
$it as $key=>$val)
echo
$key.":".$val."\n";

?>

Output
--------
apple:yummy
orange:ah ya, nice
grape:wow, I love it!
plum:nah, not me
potato:chips
carrot:soup
up
-8
daniel dot rutkoski at gmail dot com
4 years ago
<?php
class PrintArray
{
    private
$code = null;

    function
__construct ($val)
    {
       
$this->code = $val;
       
$this->_print();
    }
   
    private function
arrayIterator($val, $grau)
    {
       
$grau++;
       
$arr = new \ArrayIterator($val);
        while (
$arr->valid())
        {
            if(
is_array($arr->current()))
            {
               
$this->arrayIterator($arr->current(), $grau);
            }
            else
            {
               
$this->code .= str_repeat(" ", (4 * $grau)) . $arr->key() . " : " . $arr->current() . PHP_EOL;
            }
           
$arr->next();
        }
    }
   
    private function
_print()
    {
        if (
is_array($this->code))
        {
           
$arr = new \ArrayIterator($this->code);
           
$this->code = 'array(' . PHP_EOL;
            while (
$arr->valid())
            {
                if(
is_array($arr->current()))
                {
                   
$this->arrayIterator($arr->current(), 0);
                }
                else
                {
                   
$this->code .= $arr->key() . " : " . $arr->current() . "\n";
                }
               
$arr->next();
            }
           
$this->code .= ')';
        }
        return
$this;
    }
   
    public function
getVal ()
    {
        return
$this->code;
    }
}

$arr = array(
    array(
       
'ok' => 1, array(9,7,5,9,'a','b'=>array(1,2)),
       
'error' => 2, array('h','u','o')
    )
    ,
'array'
);
$pArray = new PrintArray($arr);
var_dump($pArray->getVal());
up
-23
foobuilder at gmail dot com
8 years ago
Unsetting all keys of an ArrayItem within foreach will always leave the second key:

<?php
$items
= new ArrayObject(range(0, 9));

while (list(
$k, $v) = each($items)) {
    unset(
$items[$k]);
}

print_r($items);

//  ArrayIterator Object
//  (
//      [storage:ArrayIterator:private] => Array
//          (
//              [1] => 1
//          )
//  )
?>

I'm not sure if this is a bug as unsetting keys within foreach is usually a bad idea to begin with (use while instead), but it's something to be aware of.
To Top