Array2Nested

Gepost door Leon v. d. Veen op 31-12-2008 12:30.

D.m.v. deze class kan je een array nested benaderen.

Je kan vars on-the-fly setten, unsetten, testen (isset) en veranderen. Ook kan je de Nested versie weer om zetten naar Array.

Voorbeelden zitten bij de source.

Voor vragen of opmerkingen sta ik open :P

EDIT: Ik zie nu pas dat er pas geleden een class is gepost onder de zelfde naam, haha. Dat is wel toevallig.

Bestanden van dit script

index.php

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
[Array2Nested.class.php]
<?php
/**

 * Array To Nested Class

 *

 * @name    Array2Nested

 * @author    Leon van der Veen

 */

class Array2Nested{

    /**

     * @var array

     */

    private $_array;

    

    /**

     * Constructor

     *

     * @param array $array

     */

    public function __construct($array=NULL){

        if(is_array($array)){

            $this->_array = &$array;

        }else{

            $this->_array = array();

        }

    }

    

    /**

     * Get

     *

     * @param    string $key

     * @return    var|Array2Nested

     */

    public function __get($key){

        if(array_key_exists($key, $this->_array)){

            if(is_array($this->_array[$key])) return new Array2Nested(&$this->_array[$key]);

            return $this->_array[$key];

        }

        $this->_array[$key] = array();

        return new Array2Nested(&$this->_array[$key]);

    }

    

    /**

     * Set

     *

     * @param    string $key

     * @param    var|Array2Nested $var

     */

    public function __set($key, $var){

        if($var instanceof Array2Nested){

            $this->_array[$key] = $var->asArray();

        }

        $this->_array[$key] = $var;

    }

    

    /**

     * Isset

     *

     * @param string $key

     * @return bool

     */

    public function __isset($key){

        return isset($this->_array[$key]);

    }

    

    /**

     * Unset

     *

     * @param string $key

     */

    public function __unset($key){

        if(isset($this->_array[$key])) unset($this->_array[$key]);

    }

    

    /**

     * To Array

     *

     * @return    array

     */

    public function toArray(){

        return $this->_array;

    }

    

    /**

     * To String

     *

     * @return    string

     */

    public function __toString(){

        return 'Array('.count($this->_array).')';

    }

    

    /**

     * Get Childs

     *

     * @return array

     */

    public function getChilds(){

        $array = array();

        foreach($this->_array as $key=>$val){

            if(is_array($val)){

                $array[$key] = new Array2Nested($val);

            }else{

                $array[$key] = $val;

            }

        }

        return $array;

    }

};
?>

[index.php]
<?php
// Include Array2Nested Class
require_once('Array2Nested.class.php');

// Array2Nested: Config Example
$config = array();
$config['database'] = array();
$config['database']['host']                = 'localhost';
$config['database']['user']                = 'root';
$config['database']['pass']                = 'password';
$config['database']['db']                = 'testdb';
$config['gallery'] = array();
$config['gallery']['big_max_width']        = 1024;
$config['gallery']['big_max_height']    = 768;
$config['gallery']['thumb_max_width']    = 100;
$config['gallery']['thumb_max_height']    = 100;
$config['site'] = array();
$config['site']['name']                    = 'Test site';
$config['site']['keywords']                = 'test, site, array, 2, to, nested, array2nested, arraytonested';
$config['site']['description']            = 'Array2Nested test site';
$conf = new Array2Nested($config);

// Connect to mysql example
$mysql_con = @mysql_connect($conf->database->host, $conf->database->user, $conf->database->pass);
@mysql_select_db($conf->database->db, $mysql_con);

// Intergrated html example
?><html>
    <head>
        <title><?=$conf->site->name;?></title>
        <meta http-equiv="keywords" content="<?=$conf->site->keywords;?>" />
        <meta http-equiv="description" content="<?=$conf->site->description;?>" />
    </head>
    <body>
         <!-- ... -->
     </body>
</html><?php

// Get gallery settings
print 'Max thumb site: '.$conf->gallery->thumb_max_width.'x'.$conf->gallery->thumb_max_height."<br/>\n";

// List example
print "<br/>\n";
$list = new Array2Nested(array('groente'=>array('spinasie', 'prei', 'andijnvie'), 'fruit'=>array('appel', 'peer', 'banaan', 'kiwi', 'sinasappel')));
foreach($list->getChilds() as $key=>$kind){
    print '<b>['.$key.']</b>: '."<br/>\n";
    foreach($kind->getChilds() as $i){
        print $i."<br/>\n";
    }
}

// Error examples
print "<br/>\n";
var_dump(isset($conf->foo)); // isset
print "<br/>\n";
var_dump($conf->foo); // null
print "<br/>\n";
print "<br/>\n";
print '<pre>'."\n";
print_r($conf->toArray()); // toArray
print '</pre>'."\n";
unset($conf->site->keywords);  // unset
print "<br/>\n";
print '<pre>'."\n";
print_r($conf->toArray()); // toArray
print '</pre>'."\n";
print "<br/>\n";
print "<br/>\n";
print '$conf->gallery = '.$conf->gallery."<br/>\n"; // __toString

// Begin empty example
$begin_empty = new Array2Nested();
$begin_empty->test->text = 'test text';
$begin_empty->text = 'text';
print "<br/>\n";
print "<br/>\n";
print_r($begin_empty->toArray());
?>

Commentaar

31-12-2008 12:00

"EDIT: Ik zie nu pas dat er pas geleden een soort gelijke class is gepost onder de zelfde naam, haha. Dat is wel toevallig. Maar vergelijk deze twee maar. Welke is het beste?"

Even voor de duidelijkheid, de andere klasse die er staat doet iets anders, die zorgt voor een soort adjacency list model. Deze is... tja, gewoon bedoeld zodat je een array als object kunt gebruiken. Bij lange na niet hetzelfde. ;)

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
31-12-2008 12:25

Ik heb het al aangepast. Ik had niet goed naar zijn code gekeken. Maar dan nog, op je nog opmerkingen, verbeteringen, etc. op deze code?

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
31-12-2008 15:15

Wat is precies de meerwaarde over dit? Hiermee kan ik direct een array als object benaderen. :-)

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
32
33
34
35
36
37
38
39
40
41
42
43
<?php
class SimpleArray {
    private $_data = array();

    public function __construct(array $data) {
        foreach($data as $key => $value) {
            $this->__set($key, $value);
        }
    }

    public function __get($key) {
        return $this->_data[$key];
    }

    public function __set($key, $value) {
        if(is_array($value)) {
            $this->_data[$key] = new SimpleArray($value);
        } else {
            $this->_data[$key] = $value;
        }
    }

    public function __isset($key) {
        return isset($this->_data[$key]);
    }

    public function __unset($key) {
        unset($this->_data[$key]);
    }

    public function toArray() {
        $return = array();
        foreach($this->_data as $key => $value) {
            if($value instanceof SimpleArray) {
                $return[$key] = $value->toArray();
            } else {
                $return[$key] = $value;
            }
        }
        return $return;
    }
}
?>
31-12-2008 18:04

Met mijn versie kan je niet alleen een array als object benederen, maar je ken ook terplekken vanuit een object een array maken en aanpassen.

Zie sourcecode. Dit kan met die van jouw niet.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$lang = new Array2Nested();
$lang->name = 'Dutch';
$lang->navigation->prev = 'Vorige';
$lang->navigation->next = 'Volgende';
$lang->navigation->back = 'Terug';
$lang->formats->date = 'd-m-Y';
$lang->formats->time = 'H:i:s';
// ...
$array = $lang->toArray();
print_r($array);
?>
31-12-2008 20:07

Volgens mij kan de mijne dat toch echt wel hoor. :-)

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
01-01-2009 07:00

Ik denk het niet. Dit is omdat je geen pointer mee geeft aan de nieuwe object en je bij een lege __get geen object returned. Ik post dit nu net na dat ik uit ben geweest, dus weet niet of mijn zinnen wel kloppen :P ik ga pitten...

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
01-01-2009 16:37

Daar heb je me toch, maar dan bij deze. :-)

Oh, en nog een heel erge fout:
"return new Array2Nested(&$this->_array[$key]);"

Die reference mag dus absoluut niet! References forceer je in de functie zelf, niet bij de call.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php 
class SimpleArray { 
    private $_data = array(); 

    public function __construct(array $data = array()) { 
        foreach($data as $key => $value) { 
            $this->__set($key, $value); 
        } 
    } 

    public function __get($key) {
        if(!isset($this->_data[$key])) {
            $this->_data[$key] = new SimpleArray;
        }
        return $this->_data[$key]; 
    } 

    public function __set($key, $value) { 
        if(is_array($value)) { 
            $this->_data[$key] = new SimpleArray($value); 
        } else { 
            $this->_data[$key] = $value; 
        } 
    } 

    public function __isset($key) { 
        return isset($this->_data[$key]); 
    } 

    public function __unset($key) { 
        unset($this->_data[$key]); 
    } 

    public function toArray() { 
        $return = array(); 
        foreach($this->_data as $key => $value) { 
            if($value instanceof SimpleArray) { 
                $return[$key] = $value->toArray(); 
            } else { 
                $return[$key] = $value; 
            } 
        } 
        return $return; 
    } 
} 


$lang = new SimpleArray(); 
$lang->name = 'Dutch'; 
$lang->navigation->prev = 'Vorige'; 
$lang->navigation->next = 'Volgende'; 
$lang->navigation->back = 'Terug'; 
$lang->formats->date = 'd-m-Y'; 
$lang->formats->time = 'H:i:s'; 
// ... 
$array = $lang->toArray(); 
print_r($array); 
?>
01-01-2009 22:33

"Oh, en nog een heel erge fout:
"return new Array2Nested(&$this->_array[$key]);"

Die reference mag dus absoluut niet! References forceer je in de functie zelf, niet bij de call. "

En waarom is dat dan?
Als ik buiten de class een array opgeeft maar die array bijv. ook voor andere doeleinde wil gebruiken wil je deze niet als pointer mee geven. Zie source. deze var_dump geeft in dit geval als goed is dan een NULL, wat je niet wilt...

1
2
3
4
5
6
<?php
$array = array('a'=>1, 'b'=>2, 'c'=>3);
$obj = new Array2Nested($array);
unset($obj->a);
var_dump($array['a']);
?>
01-01-2009 23:27

Calltime pass-by-reference is deprecated, op mijn server zal ik het niet eens kunnen gebruiken. Het is compleet nutteloos, aangezien het prima anders kan (wat mijn revisie bewijst).

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
Inloggen wachtwoord vergeten? Aanmelden