Re: note 105697 added to book.simplexml

From: Date: Thu, 08 Sep 2011 17:07:41 +0000
Subject: Re: note 105697 added to book.simplexml
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-183051@lists.php.net to get a copy of this message
Merged. Thanks for not only reading and following the rules, but for acknowledging that you did. You're actually the first and only so far! On Wed, Sep 7, 2011 at 21:25, <xananax@yelostudio.com> wrote: > Improved version of my simpleXMLToArray. If a moderator could delete/replace my previous > version, which has a bug, it would be great. > <?php > /** >  * Converts a simpleXML element into an array. Preserves attributes.<br/> >  * You can choose to get your elements either flattened, or stored in a custom >  * index that you define.<br/> >  * For example, for a given element >  * <code> >  * <field name="someName" type="someType"/> >  * </code> >  * <br> >  * if you choose to flatten attributes, you would get: >  * <code> >  * $array['field']['name'] = 'someName'; >  * $array['field']['type'] = 'someType'; >  * </code> >  * If you choose not to flatten, you get: >  * <code> >  * $array['field']['@attributes']['name'] = > 'someName'; >  * </code> >  * <br>__________________________________________________________<br> >  * Repeating fields are stored in indexed arrays. so for a markup such as: >  * <code> >  * <parent> >  *     <child>a</child> >  *     <child>b</child> >  *     <child>c</child> >  * ... >  * </code> >  * you array would be: >  * <code> >  * $array['parent']['child'][0] = 'a'; >  * $array['parent']['child'][1] = 'b'; >  * ...And so on. >  * </code> >  * @param simpleXMLElement      $xml                    the XML to convert >  * @param boolean|string        $attributesKey  if you pass TRUE, all values will be >  *                                                             >                          stored under an '@attributes' index. >  *                                                             >                          Note that you can also pass a string >  *                                                             >                          to change the default index.<br/> >  *                                                             >                          defaults to null. >  * @param boolean|string        $childrenKey    if you pass TRUE, all values will be >  *                                                             >                          stored under an '@children' index. >  *                                                             >                          Note that you can also pass a string >  *                                                             >                          to change the default index.<br/> >  *                                                             >                          defaults to null. >  * @param boolean|string        $valueKey               if you pass TRUE, all > values will be >  *                                                             >                          stored under an '@values' index. Note >  *                                                             >                          that you can also pass a string to >  *                                                             >                          change the default index.<br/> >  *                                                             >                          defaults to null. >  * @return array the resulting array. >  */ > function simpleXMLToArray(SimpleXMLElement > $xml,$attributesKey=null,$childrenKey=null,$valueKey=null){ > >        if($childrenKey && !is_string($childrenKey)){$childrenKey = > '@children';} >        if($attributesKey && !is_string($attributesKey)){$attributesKey = > '@attributes';} >        if($valueKey && !is_string($valueKey)){$valueKey = '@values';} > >        $return = array(); >        $name = $xml->getName(); >        $_value = trim((string)$xml); >        if(!strlen($_value)){$_value = null;}; > >        if($_value!==null){ >                if($valueKey){$return[$valueKey] = $_value;} >                else{$return = $_value;} >        } > >        $children = array(); >        $first = true; >        foreach($xml->children() as $elementName => $child){ >                $value = simpleXMLToArray($child,$attributesKey, > $childrenKey,$valueKey); >                if(isset($children[$elementName])){ >                        if(is_array($children[$elementName])){ >                                if($first){ >                                        $temp = $children[$elementName]; >                                        unset($children[$elementName]); >                                        $children[$elementName][] = $temp; >                                        $first=false; >                                } >                                $children[$elementName][] = $value; >                        }else{ >                                $children[$elementName] = > array($children[$elementName],$value); >                        } >                } >                else{ >                        $children[$elementName] = $value; >                } >        } >        if($children){ >                if($childrenKey){$return[$childrenKey] = $children;} >                else{$return = array_merge($return,$children);} >        } > >        $attributes = array(); >        foreach($xml->attributes() as $name=>$value){ >                $attributes[$name] = trim($value); >        } >        if($attributes){ >                if($attributesKey){$return[$attributesKey] = $attributes;} >                else{$return = array_merge($return, $attributes);} >        } > >        return $return; > } > ?> > PS: I have read and understood "What not to post", but the previous version had a > bug; knowing the number of people that use php.net as a reference, I could not possibly leave it > like that. > ---- > Server IP: 69.147.83.197 > Probable Submitter: 194.126.14.101 > ---- > Manual Page -- http://www.php.net/manual/en/book.simplexml.php > Edit        -- https://master.php.net/note/edit/105697 > Del: integrated  -- > https://master.php.net/note/delete/105697/integrated > Del: useless     -- > https://master.php.net/note/delete/105697/useless > Del: bad code    -- > https://master.php.net/note/delete/105697/bad+code > Del: spam        -- > https://master.php.net/note/delete/105697/spam > Del: non-english -- > https://master.php.net/note/delete/105697/non-english > Del: in docs     -- > https://master.php.net/note/delete/105697/in+docs > Del: other reasons-- https://master.php.net/note/delete/105697 > Reject      -- https://master.php.net/note/reject/105697 > Search      -- https://master.php.net/manage/user-notes.php > > > -- > PHP Notes Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php > > -- </Daniel P. Brown> Network Infrastructure Manager http://www.php.net/

« previous php.notes (#183051) next »