Re: Arrays

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux