RecursiveArrayObject

Door Iltar van der berg, 14 jaar geleden, 1.652x bekeken

Class bedoelt om de functionaliteit van de SPL class ArrayObject te vergroten.
Als je nu een een array erin gooit, loopt hij em door. Als hij een array tegen komt, vervangt hij het door zichzelf met de bijhorende contents.

Mocht hij dan ge echoed worden in een foreach, geeft hij netjes 'Array' terug alsof je echo array(); doet.

evt kan je de exception eraf halen maar dat is niet aangeraden.

Gesponsorde koppelingen

PHP script bestanden

  1. recursivearrayobject

 

Er zijn 8 reacties op 'Recursivearrayobject'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Marcel
Marcel
14 jaar geleden
 
0 +1 -0 -1
Ik snap em niet, of het nut niet, ofzo. Voorbeeld? ^_^


14 jaar geleden
 
0 +1 -0 -1
Als ik hem goed begrijp kan je nu doen

foreach ($semiarray as $v)
{
foreach($v as $entry) // deze zou normaal gesproken niet direct kunnen
{
echo $entry;
}
}
Iltar van der berg
iltar van der berg
14 jaar geleden
 
0 +1 -0 -1
Hier is een linkje naar de documentatie van ArrayAccess
http://www.php.net/~helly/php/ext/spl/classArrayObject.html

hier een klein voorbeeldje van gebruik (Berg_Registry_Storage is het hier),
Erg handig omdat ik bv een registry heb, maar geen non objects erin wil hebben. Dit ivm met een functie setDelayed (deze zet alleen de classname erin zodat get() em aanmaakt zodra hij word opgevraagd). Zo houd je een geordende structuur binnen je applicatie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

    /**
     * Set a key in the registry
     *
     * You can use an array for storing things
     * like configuration data. If you want the
     * object the be created only when requested
     * you can use the {@link setDelayed} method.
     *
     * @param string|int $accessKey key to access the object
     * @param object|array $class object or array to be stored
     */

    static public function set($accessKey, $class)
    {

        // if not an object but is and array, create a storage object
        // this prevents the registry from getting non objects

        if(!is_object($class)) {

            if(!is_array($class)) {
                throw new Berg_Registry_Exception(__CLASS__ . '::' . __METHOD__ . '($class) has to be an object or array');
            }


            $class = new Berg_Registry_Storage($class);
        }


        $instance = self::instance();
        $instance->offsetSet($accessKey, $class);
    }


?>
Bo az
Bo az
14 jaar geleden
 
0 +1 -0 -1
Afdwingen dat er alleen een array in kan, kan ook op de volgende manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
public function __construct(Array $array)
[
/code]
Iltar van der berg
iltar van der berg
14 jaar geleden
 
0 +1 -0 -1
Heb het veranderd :)
Lode
Lode
14 jaar geleden
 
0 +1 -0 -1
Nog iets netter als je het mij vraagt....

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
public function __construct(array $array = array()){
    //validatie optioneel...
    if(count($array, COUNT_NORMAL) < 1){
         throw new UnderflowException('$array is empty');
    }

    ///
}
?>
Jelmer -
Jelmer -
14 jaar geleden
 
0 +1 -0 -1
Als je dan een object/array aan je ding toevoegt dat toevallig een lege array bevat ergens in een van z'n kinderen, krijg je meteen een exception naar je hoofd gegooid. Lege arrays hier en daar lijken mij eerder een regel dan een uitzondering.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Iltar van der berg
iltar van der berg
14 jaar geleden
 
0 +1 -0 -1
Je kan er ook een lege array in zetten die je later vult, dus is een check op de lengte eigenlijk een beetje overbodig

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. recursivearrayobject

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.