array2xml

Door , 14 jaar geleden, 6.326x bekeken

Je kunt deze functionaliteit genoeg vinden op internet. Echter kon ik nergens gewoon een eenvoudige functie vinden, die niks anders doet dan de array letterlijk vertalen naar XML (geen rotzooi ervan maakt). En daarbij had ik als wens dat nieuwe contrainers ingesprongen worden.

Nb: misschien vraag je je af waarom er geen doctype bij zit?
Dit is vanwege het feit dat ik deze class met name voor AFB (Adobe Flash Builder) gebruik.

Gesponsorde koppelingen

PHP script bestanden

  1. array2xml

 

Er zijn 10 reacties op 'Array2xml'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robin
Robin
14 jaar geleden
 
0 +1 -0 -1
Ziet er goed uit... Alleen... Waarom een Private Function?


14 jaar geleden
 
0 +1 -0 -1
Omdat ik niet wil dat je die functie kan aanroepen van buiten de class. De programmeur mag wat mij betreft, geen invloed hebben op de parameter $p_iTabs.
GaMer B
GaMer B
14 jaar geleden
 
0 +1 -0 -1
Nette class. Meer valt er niets te zeggen ^^,
Niels Vanderheyden
Niels Vanderheyden
14 jaar geleden
 
0 +1 -0 -1
Heel handige class :). Maar waarvoor gebruik je het?
Misschien voor flex om een arrayCollection om te zetten in xml?
GaMer B
GaMer B
14 jaar geleden
 
0 +1 -0 -1
Je kan eerder vragen: Waarvoor gebruik je het niet :P. Je kan zo allerlei XML bestanden genereren.


14 jaar geleden
 
0 +1 -0 -1
@Niels je zou bijvoorbeeld met php gegevens uit een database kunnen halen, dit vervolgens in een array zetten en er XML van maken 'met deze class'. Deze data haal je dan weer op doormiddel van een httpRequest in flash builder (voorheen flex), en doormiddel van een dataProvider 'de XML source' kun je de data in een DataGrid weergeven.

@GaMer13 kan ook natuurlijk, je zult het wel weg moeten schrijven dan :)
PHP erik
PHP erik
14 jaar geleden
 
0 +1 -0 -1
Qua OOP vind ik het juist helemaal niet netjes. Array2xml is een handeling, geen object. Je hebt niet "een array2xml". Je zou nog eerder een class Array kunnen hebben met een method toXml().

Deze is wel erg netjes:
http://www.devexp.eu/?p=605

Maar wel leuke toevoeging, het is niet mijn bedoeling het direct af te kraken of zoiets, maar ik moest toch de uitspraak van GaMer13 weerleggen aangezien mensen het anders verkeerd leren.

Het is trouwens ook niet logisch dat de method create_xml() private is, en het is al helemaal niet logisch dat je in get_xml() statisch create_xml() aanroept als het geen statische method is.


14 jaar geleden
 
0 +1 -0 -1
@Erik je mag ervan zeggen wat je vind en je mag het ook niet logisch vinden. Enkel dat het in een class staat is omdat dit gewoon makkelijker programmeert.
Waarom ik de functie get_xml private heb gemaakt, is enkel omdat ik wil dat het zo behandeld word. Ik zie dit object gewoon als een functie. Er staat trouwens nergens dat hij aan de OOP eisen voldoet, hoeft naar mij mening ook niet. Ook dient deze class niet om mensen PHP te leren, maar is enkel geplaatst omdat ik de functionaliteit wil delen. Mocht je er niks aan hebben of een andere oplossing weten, gebruik je die toch. De class die je wel netjes vind, is trouwens een stuk trager dan de mijne voor het zelfde doel. Sneller is niet altijd beter. Maar beter is een mening, en de snelheid is een feit. Toch bedankt voor je reactie.
Toby hinloopen
toby hinloopen
14 jaar geleden
 
0 +1 -0 -1
@die 2 boven me:
ik zie vaker dit soort structuren in PHP "classes". Zo vreemd is het niet.

Persoonlijk maak ik altijd een structuur waarbij je de functies op de volgende manier kan gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?
xml::fromArray();
xml::toArray();
//en je kan nog meer verzinnen, zoals:
xml::fromObject();
xml::toObject();
xml::toYAML();
xml::fromYAML();
xml::toJSON();
xml::fromJSON();
?>


Ik noem zo'n class een "static class". Een class met alleen maar functies dus.
De classe als object gebruiken is hierbij dus ook niet mogelijk.

Een classe waar je het als object moet - of KAN - gebruiken noem ik een "object class". Mijn object classes kan je ook vaak als een static-class gebruiken.

Dit is bijv. een SQL class van mij:
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
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
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
<?php

/**
 * SQL database class
 * 2009-03-28
 * Toby Hinloopen
 */


class sql {
    
    private static $default_host;
    private static $default_username;
    private static $default_password;
    private static $default_database;
    public static $default_instance;
    
    private $connection;
    
    private $last_error_id;
    private $last_error_str;
    
    private $last_raw_result;
    
    public static $queries = array();
    
    public static function set_defaults($host = false,$user = false,$pass = false,$db = false) {
        if(is_string($host)) {//if host is not set correctly and default_host is set...
            self::$default_host = $host;
        }

        if(is_string($user)) {//if user is not set correctly and default_username is set...
            self::$default_username = $user;
        }

        if(is_string($pass)) {//if pass is not set correctly and default_password is set...
            self::$default_password = $pass;
        }

        if(is_string($db)) {//if db is not set correctly and default_database is set...
            self::$default_database = $db;
        }
    }

    
    //object constructor
    public function __construct($host = false,$user = false,$pass = false,$db = false,$force_set_as_default = false) {
        if($force_set_as_default
        || !isset(self::$default_instance)) {//if default_instance should be force-overwritten OR it is not set...
            $this->as_default();
        }

        $this->connect($host,$user,$pass,$db);
    }

    
    //static constructor
    public static function init($host = false,$user = false,$pass = false,$db = false) {
        return self::$default_instance = new self($host,$user,$pass,$db,true);
    }

    
    public function as_default() {
        if(!isset($this)) {
            self::error(8,'Function sql::as_default cannot be used in static context.');            
            return false;
        }

        self::$default_instance = $this;
    }

    
    public function connect($host = false,$user = false,$pass = false,$db = false) {
        if(!isset($this)) {
            self::error(9,'Function sql::connect cannot be used in static context.');            
            return false;
        }

        if(!is_string($host)
        &&
is_string(self::$default_host)) {//if host is not set correctly and default_host is set...
            $host = self::$default_host;
        }

        if(!is_string($user)
        &&
is_string(self::$default_username)) {//if user is not set correctly and default_username is set...
            $user = self::$default_username;
        }

        if(!is_string($pass)
        &&
is_string(self::$default_password)) {//if user is not set correctly and default_password is set...
            $pass = self::$default_password;
        }

        if(!is_string($db)
        &&
is_string(self::$default_database)) {//if database is not set correctly and default_database is set...
            $db = self::$default_database;
        }

        $this->connection = mysql_connect($host,$user,$pass);
        if(!$this->connection) {
            $this->error(1,'Could not connect to MySQL server: '.mysql_error());
            return false;
        }
else {
            mysql_set_charset('utf8',$this->connection);
            if(is_string($db) && !mysql_select_db($db,$this->connection)) {
                $this->error(2,'Could not select database: '.mysql_error());
                return false;
            }

            return true;
        }
    }

    
    public function escape($string) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->escape($string);
        }

        return (string)mysql_real_escape_string((string)$string,$this->connection);
    }

    
    public function query($query) {
        if(!isset($this)) {
            return self::$default_instance->query($query);
        }

        self::$queries[] = 'BUFFERED("'.addslashes($query).'"): '.(string)$this->connection;
        if($r = mysql_query($query,$this->connection)) {
            $this->last_raw_result = $r;
            return $r;
        }
else {
            $this->error(3,'MySQL query failed: '.mysql_error());
            return false;
        }
    }

    
    public function unbuffered_query($query) {
        if(!isset($this)) {
            return self::$default_instance->unbuffered_query($query);
        }

        self::$queries[] = 'UNBUFFERED("'.addslashes($query).'"): '.(string)$this->connection;
        if($r = mysql_unbuffered_query($query,$this->connection)) {
            $this->last_raw_result = $r;
            return $r;
        }
else {
            $this->error(4,'unbuffered MySQL query failed: '.mysql_error());
            return false;
        }
    }

    
    public function free($result = false) {
        if(is_resource($result)) {
            return mysql_free_result($result);
        }
elseif(!isset($this)) {
            return self::$default_instance->free($result);
        }
elseif(is_resource($this->last_raw_result)) {
            $succes = mysql_free_result($this->last_raw_result);
            $this->last_raw_result = null;
            return $succes;            
        }
else {
            $this->error(5,'No result to free');
            return false;
        }
    }

    
    public function query_result_int($query) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_int($query);
        }

        $r = $this->query_result_row($query,false);
        return isset($r[0])?(int)$r[0]:false;
    }

    
    public function query_result_string($query) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_string($query);
        }

        $r = $this->query_result_row($query,false);
        return isset($r[0])?(string)$r[0]:false;
    }

    
    public function query_result_unixtime($query) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_unixtime($query);
        }

        $r = $this->query_result_row($query,false);
        return isset($r[0])?(int)strtotime($r[0]):false;
    }

    
    public function query_result_row($query,$autoformat = true) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_row($query,$autoformat);
        }

        $rr = $this->query($query);
        if(!$rr) {
            return false;
        }

        if($r = mysql_fetch_row($rr)) {
            foreach($r as $key=>$value) {
                if($autoformat) {
                    $type = mysql_field_type($rr,$key);
                    if($type == 'int') {
                        $r[$key] = (int)$value;
                    }
elseif($type == 'timestamp') {
                        $r[$key] = (int)strtotime($value);
                    }
else {
                        $r[$key] = $value;
                    }
                }
            }

            $this->free();
            return $r;
        }
else {
            return array();
        }
    }

    
    public function query_result_assoc($query,$autoformat = true) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_assoc($query,$autoformat);
        }

        $rr = $this->query($query);
        if(!$rr) {
            return false;
        }

        if($r = mysql_fetch_assoc($rr)) {
            
            if($autoformat) {
                $keys=array_keys($r);
                $types=array();
                foreach($keys as $offset=>$key) {
                    $types[$key] = mysql_field_type($rr,$offset);
                }

                foreach($r as $key=>$value) {
                    if($types[$key] == 'int') {
                        $r[$key] = (int)$value;
                    }
elseif($types[$key] == 'timestamp') {
                        $r[$key] = (int)strtotime($value);
                    }
else {
                        $r[$key] = $value;
                    }
                }
            }

            
            return $r;
        }
else {
            return array();
        }
    }

    
    public function query_result_auto($query,$indexkey = false,$allowmultidimarray = false,$autoformat = true) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->query_result_auto($query,$indexkey,$allowmultidimarray,$autoformat);
        }

        $rr = $this->unbuffered_query($query);
        if(!$rr) {
            return false;            
        }

        $output = array();
        while($r = mysql_fetch_assoc($rr)) {
            
            if(!isset($keys)) {
                $keys=array_keys($r);
                if($autoformat) {
                    $types=array();
                    foreach($keys as $offset=>$key) {
                        $types[$key] = mysql_field_type($rr,$offset);
                    }
                }
            }

            if($autoformat) {
                foreach($r as $key=>$value) {
                    if($types[$key] == 'int') {
                        $r[$key] = (int)$value;
                    }
elseif($types[$key] == 'timestamp') {
                        $r[$key] = (int)strtotime($value);
                    }
else {
                        $r[$key] = $value;
                    }
                }
            }

            
            if($indexkey===false) {
                if(count($r)>1) {
                    $output[] = $r;
                }
else {
                    $keys=array_keys($r);
                    $output[] = $r[$keys[0]];
                }
            }
elseif(count($r)!=2) {
                if($allowmultidimarray===false) {
                    $output[$r[$indexkey]]=$r;
                }
elseif(!isset($output[$r[$indexkey]])) {
                    $output[$r[$indexkey]]=array($r);
                }
else {
                    array_push($output[$r[$indexkey]],$r);
                }
            }
else {
                if($keys[0]!=$indexkey) {
                    $output[$r[$indexkey]]=$r[$keys[0]];
                }
else {
                    $output[$r[$indexkey]]=$r[$keys[1]];
                }
            }
        }

        return $output;
    }

    
    public function delete($from,$where = '1') {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->delete($from,$where);
        }

        $this->query('DELETE FROM `'.$from.'` WHERE '.$where);
        return mysql_affected_rows($this->connection);
    }

    
    public function update($table,$values = array(),$where = '1') {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->update($table,$values,$where);
        }

        $sqlvalue = '';
        foreach($values as $key=>$value) {
            if($sqlvalue != '') {
                $sqlvalue.=', ';
            }

            $sqlvalue .= '`'.$key.'` = "'.$this->escape($value).'"';
        }

        
        $this->query('UPDATE `'.$table.'` SET '.$sqlvalue.' WHERE '.$where);
        return mysql_affected_rows($this->connection);
    }

    
    public function insert($into,$ivalues = array()) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->insert($into,$ivalues);
        }

        $keys = '';
        $values = '';
        foreach($ivalues as $key=>$value) {
            if($keys != '') {
                $keys .= ', ';
            }

            if($values != '') {
                $values .= ', ';
            }

            $keys .= '`'.$key.'`';
            $values .= '\''.$this->escape($value).'\'';
        }

        
        $this->query('INSERT INTO `'.$into.'` ('.$keys.') VALUES ('.$values.')');
        return mysql_insert_id($this->connection);
        //INSERT INTO `livphp4`.`filesystem` (`id`, `name`, `location`, `data`, `type`) VALUES (NULL, 'abcd', '0', '', 'folder');
    }
    
    private function error($id,$str) {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->error($id,$str);
        }

        $this->last_error_id = $id;
        $this->last_error_str = $str;
        classerror($this);
        return true;
    }

    
    public function error_id() {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->error_id();
        }

        return $this->last_error_id;
    }

    
    public function error_str() {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->error_str();
        }

        return $this->last_error_str;
    }
    
}


?>


Deze classe kan je gebruiken als static of als object.

Let daarbij op op de volgende terugkomende structuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?
    public function error_str() {
        if(!isset($this)) {
            if(!is_resource(self::$default_instance)) {
                self::init();
            }

            return self::$default_instance->error_str();
        }

        return $this->last_error_str;
    }

?>

In iedere functie wordt gekeken of "$this" bestaat. Zo niet: de functie is aangeroepen in static context. In dit geval wordt de functie dan geroepen vanaf een "default instance".

Zo heb je een static SQL class waar je toch meerdere instances van kan maken. Bij gebruik van meerdere instances kan je ze alleen niet allemaal static aanroepen.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


14 jaar geleden
 
0 +1 -0 -1
Dit heeft echt geen toegevoegde waarde als klasse. Waarom moet dit in een klasse? Als het in een klasse moet, dan lijkt het mij dat je gebruik maakt van ArrayAccess interface en Iterator interface.
Tegen een hond zeg je ook niet 'Wat een mooie poes' :-S. En andere mensen krijgen dan ook het verkeerde voorbeeld 'Ah, das een klasse, dat kan ik ook wel.' Terwijl het gewoon een paar functie's zijn... Dit gebeurt jammer genoeg maar al te vaak.
Gebruik ook simplexml of dom.
Waarom moet alles met chr? Om het "ingewikkeld" te laten lijken? Dat stukje met Self, dat is ook niet heel net vind ik, "als we gewoon een string hebben roepen we de functie opnieuw aan. Oh, wacht het is een array, dan moeten we nog wat tabs hebben om in te springen."
En als ik nouw $a[] = 'blaat'; doe? Dan krijg ik gewoon in mijn xml '<0>blaat</0>' d'r bij en dat mag niet. Daarom dus gewoon simplexml en dom gebruiken...

Edit: 'die niks anders doet dan de array letterlijk vertalen naar XML (geen rotzooi ervan maakt)' => Haha, wel dus.
'En daarbij had ik als wens dat nieuwe contrainers ingesprongen worden.' voor als je het niet kan vinden: class.domdocument#domdocument.props.formatoutput.
'Nb: misschien vraag je je af waarom er geen doctype bij zit?
Dit is vanwege het feit dat ik deze class met name voor AFB (Adobe Flash Builder) gebruik.'
Ach, dat boeit toch niet. Jouw xml is namelijk gewoon een string. Het is niet eens xml. Want waar is de XML declaration?

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

Inhoudsopgave

  1. array2xml

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.