Re: [PHP] Arrays

[email protected] (Karl DeSaulniers)
Newsgroups php.general
Message-ID <[email protected]>
On Feb 26, 2013, at 10:35 PM, tamouse mailing lists wrote:

> On Mon, Feb 25, 2013 at 9:51 PM, Karl DeSaulniers <[email protected] 
> > wrote:
>> Never mind. I found a different function that reads out the  
>> children as well
>> into the array.
>>
>>
>>                function xml_parse_into_assoc($data) {
>>                          $p = xml_parser_create();
>>
>>                          xml_parser_set_option($p,  
>> XML_OPTION_CASE_FOLDING,
>> 0);
>>                          xml_parser_set_option($p,  
>> XML_OPTION_SKIP_WHITE,
>> 1);
>>
>>                          xml_parse_into_struct($p, $data, $vals,  
>> $index);
>>                          xml_parser_free($p);
>>
>>                          $levels = array(null);
>>
>>                          foreach ($vals as $val) {
>>                            if ($val['type'] == 'open' ||  
>> $val['type'] ==
>> 'complete') {
>>                              if (!array_key_exists($val['level'],  
>> $levels))
>> {
>>                                $levels[$val['level']] = array();
>>                              }
>>                            }
>>
>>                            $prevLevel =& $levels[$val['level'] - 1];
>>                            $parent =  
>> $prevLevel[sizeof($prevLevel)-1];
>>
>>                            if ($val['type'] == 'open') {
>>                              $val['children'] = array();
>>                              array_push(&$levels[$val['level']],  
>> $val);
>>                              continue;
>>                            }
>>
>>                            else if ($val['type'] == 'complete') {
>>                              $parent['children'][$val['tag']] =
>> $val['value'];
>>                            }
>>
>>                            else if ($val['type'] == 'close') {
>>                              $pop =  
>> array_pop($levels[$val['level']]);
>>                              $tag = $pop['tag'];
>>
>>                              if ($parent) {
>>                                if (!array_key_exists($tag,
>> $parent['children'])) {
>>                                  $parent['children'][$tag] =
>> $pop['children'];
>>                                }
>>                                else if
>> (is_array($parent['children'][$tag])) {
>>                                    if(!isset($parent['children'] 
>> [$tag][0]))
>> {
>>                                        $oldSingle =
>> $parent['children'][$tag];
>>                                        $parent['children'][$tag] =  
>> null;
>>                                        $parent['children'][$tag][] =
>> $oldSingle;
>>
>>                                    }
>>                                      $parent['children'][$tag][] =
>> $pop['children'];
>>                                }
>>                              }
>>                              else {
>>                                return(array($pop['tag'] =>
>> $pop['children']));
>>                              }
>>                            }
>>
>>                            $prevLevel[sizeof($prevLevel)-1] =  
>> $parent;
>>                          }
>>                }
>>
>>
>>                        $params = xml_parse_into_assoc($result);// 
>> $result =
>> xml result from USPS api
>>
>> Original function by: jemptymethod at gmail dot com
>> Duplicate names fix by: Anonymous (comment right above original  
>> function)
>>
>> Best,
>> Karl
>>
>>
>>
>> On Feb 25, 2013, at 7:50 PM, Jim Lucas wrote:
>>
>>> On 02/25/2013 05:40 PM, Karl DeSaulniers wrote:
>>>>
>>>> Hi Guys/Gals,
>>>> If I have an multidimensional array and it has items that have  
>>>> the same
>>>> name in it, how do I get the values of each similar item?
>>>>
>>>> EG:
>>>>
>>>> specialservices => array(
>>>> specialservice => array(
>>>> serviceid => 1,
>>>> servicename=> signature required,
>>>> price => $4.95
>>>> ),
>>>> secialservice => array(
>>>> serviceid => 15,
>>>> servicename => return receipt,
>>>> price => $2.30
>>>> )
>>>> )
>>>>
>>>> How do I get the prices for each? What would be the best way to  
>>>> do this?
>>>> Can I utilize the serviceid to do this somehow?
>>>> It is always going to be different per specialservice.
>>>>
>>>> TIA,
>>>>
>>>> Best,
>>>>
>>>> Karl DeSaulniers
>>>> Design Drumm
>>>> http://designdrumm.com
>>>>
>>>>
>>>
>>> This will never work.  Your last array will always overwrite your  
>>> previous
>>> array.
>>>
>>> Here is how I would suggest building it:
>>>
>>>
>>> $items = array(
>>>   1 => array(
>>>       serviceid => 1,
>>>       servicename=> signature required,
>>>       price => $4.95
>>>   ),
>>>   15 => array(
>>>       serviceid => 15,
>>>       servicename => return receipt,
>>>       price => $2.30
>>>   )
>>> )
>>>
>>> This will ensure that your first level indexes never overwrite  
>>> themselves.
>>>
>>> But, with that change made, then do this:
>>>
>>> foreach ( $items AS $item ) {
>>> if ( array_key_exists('price', $item) ) {
>>>   echo $item['price'];
>>> } else {
>>>   echo 'Item does not have a price set';
>>> }
>>> }
>>>
>>> Resources:
>>> http://php.net/foreach
>>> http://php.net/array_key_exists
>>>
>>> --
>>> Jim Lucas
>>>
>>> http://www.cmsws.com/
>>> http://www.cmsws.com/examples/
>>
>>
>> Karl DeSaulniers
>> Design Drumm
>> http://designdrumm.com
>>
>>
>> --
>> PHP General Mailing List (http://www.php.net/)
>> To unsubscribe, visit: http://www.php.net/unsub.php
>>
>
> Would this work for you?
> http://us.php.net/manual/en/function.xml-parse-into-struct.php


That is where I got this function. :)
Comment 12 and 13 on that page.
Yes it worked for me.

Best,

Karl DeSaulniers
Design Drumm
http://designdrumm.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.