6.8 Array and Object Property Iteration

In PHP you can iterate through all the elements in an array using foreach. Although other methods are available, this is the preferred syntax for looping though results:

$person = array('firstname' => 'Rasmus',

                'lastname'  => 'Lerdorf');



foreach ($person as $key => $value) {

    print "$key: $value\n";

}

firstname: Rasmus

lastname: Lerdorf

You can also use foreach to view an object's properties:

class Person {

    // hardcode values for demonstration

    public $firstname = 'Rasmus';

    public $lastname  = 'Lerdorf';

}



$person = new Person;

foreach ($person as $property => $value) {

    print "$property: $value\n";

}

firstname: Rasmus

lastname: Lerdorf

In PHP 5, if an object property cannot be accessed because it is set as protected or private, then it will be skipped during iteration.

For example, update Person to include a private email attribute:

class Person {

    // hardcode values for demonstration

    public  $firstname = 'Rasmus';

    public  $lastname  = 'Lerdorf';

    private $email     = 'rasmus@php.net';

}



$person = new Person;

foreach ($person as $property => $value) {

    print "$property: $value\n";

}

firstname: Rasmus

lastname: Lerdorf

The email property is not printed, because you cannot access it from outside the class, but the results are different when you do a foreach inside the class. For instance, add a method named printInfo( ):

class Person {

    // hardcode values for demonstration

    public  $firstname = 'Rasmus';

    public  $lastname  = 'Lerdorf';

    private $email     = 'rasmus@php.net';



    public function printInfo( ) {

        foreach ($this as $property => $value) {

            print "$property: $value\n";

        }

    

    }

}



$person = new Person;

$person->printInfo( );

firstname: Rasmus

lastname: Lerdorf

email: rasmus@php.net

While the code inside printInfo( ) is the same as the foreach outside the class (except that you refer to the object as $this instead of $person), the first loop cannot see the private email property, because it is restricted from public access. Class methods, however, are able to view all three properties, so email is printed.