Link to home
Start Free TrialLog in
Avatar of sabecs
sabecs

asked on

PHP - get values from multi level array

Hi,
what is the best way to extract and display the following

Regular Parcel $16.65
Express Post Parcel $39.30

from my array below  

$auspost_array = json_decode($auspost_json,true);

print_r($auspost_array);

Array ( [services] => Array ( [service] => Array ( [0] => Array ( [code] => AUS_PARCEL_REGULAR [name] => Regular Parcel [price] => 16.65 [max_extra_cover] => 5000 [options] => Array ( [option] => Array ( [0] => Array ( [code] => AUS_SERVICE_OPTION_STANDARD [name] => Standard Service ) [1] => Array ( [code] => AUS_SERVICE_OPTION_REGISTERED_POST [name] => Registered Post [suboptions] => Array ( [option] => Array ( [0] => Array ( [code] => AUS_SERVICE_OPTION_DELIVERY_CONFIRMATION [name] => Delivery Confirmation ) [1] => Array ( [code] => AUS_SERVICE_OPTION_PERSON_TO_PERSON [name] => Person to Person ) [2] => Array ( [code] => AUS_SERVICE_OPTION_EXTRA_COVER [name] => Extra Cover ) ) ) ) [2] => Array ( [code] => AUS_SERVICE_OPTION_COD_POSTAGE_FEES [name] => C.O.D - Postage & Fees ) [3] => Array ( [code] => AUS_SERVICE_OPTION_COD_MONEY_COLLECTION [name] => C.O.D - Money Collection, Postage & Fees ) [4] => Array ( [code] => AUS_SERVICE_OPTION_TRACK_OVER_500G [name] => Tracking (when lodged in a Retail outlet for parcels over 500gms) ) [5] => Array ( [code] => AUS_SERVICE_OPTION_TRACK [name] => Tracking (available through Click and Send) ) [6] => Array ( [code] => AUS_SERVICE_OPTION_TRACK_SIGN [name] => Tracking with Signature (available through Click and Send) [suboptions] => Array ( [option] => Array ( [code] => AUS_SERVICE_OPTION_EXTRA_COVER [name] => Extra Cover ) ) ) ) ) ) [1] => Array ( [code] => AUS_PARCEL_EXPRESS [name] => Express Post Parcel [price] => 39.30 ) [2] => Array ( [code] => AUS_PARCEL_PLATINUM [name] => Express Post Platinum Parcel [price] => 44.70 [max_extra_cover] => 5000 [options] => Array ( [option] => Array ( [code] => AUS_SERVICE_OPTION_PLATINUM_EXTRA_COVER_SERVICE [name] => Standard cover [suboptions] => Array ( [option] => Array ( [code] => AUS_SERVICE_OPTION_EXTRA_COVER [name] => Extra Cover ) ) ) ) ) ) ) )

Open in new window


Thanks in advance for your feedback..
SOLUTION
Avatar of Lee Wadwell
Lee Wadwell
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
You could use the SPL RecursiveArrayIterator (http://it.php.net/recursivearrayiterator):

$matches = array();
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($auspost_array));
foreach($iterator as $name=>$value) {
  if(preg_match("/Regular Parcel/", $name) || preg_match("/Express Post Parcel/", $name)){
    $maches[] = $name . ": " . $value;
  }
}

print_r($matches);

Cheers
You might want to consider breaking that array down into smaller arrays. That would not be the easiest to work with like it is.
Maybe the best way is not to use your array, but to use the original data.  Can you please post that in the code snippet?  Thanks, ~Ray
Good call Ray :)
Avatar of sabecs
sabecs

ASKER

Sorry for the delay in getting back to you, I though I had already accepted a solution. lwadwell solutions works for me but if there is a better way I have posted the original data below.

Thanks..

{"services":{"service":[{"code":"AUS_PARCEL_REGULAR","name":"Regular Parcel","price":14.75,"max_extra_cover":5000,"options":{"option":[{"code":"AUS_SERVICE_OPTION_STANDARD","name":"Standard Service"},{"code":"AUS_SERVICE_OPTION_REGISTERED_POST","name":"Registered Post","suboptions":{"option":[{"code":"AUS_SERVICE_OPTION_DELIVERY_CONFIRMATION","name":"Delivery Confirmation"},{"code":"AUS_SERVICE_OPTION_PERSON_TO_PERSON","name":"Person to Person"},{"code":"AUS_SERVICE_OPTION_EXTRA_COVER","name":"Extra Cover"}]}},{"code":"AUS_SERVICE_OPTION_COD_POSTAGE_FEES","name":"C.O.D - Postage & Fees"},{"code":"AUS_SERVICE_OPTION_COD_MONEY_COLLECTION","name":"C.O.D - Money Collection, Postage & Fees"},{"code":"AUS_SERVICE_OPTION_TRACK_OVER_500G","name":"Tracking (when lodged in a Retail outlet for parcels over 500gms)"}]}},{"code":"AUS_PARCEL_REGULAR_SATCHEL_5KG","name":"Prepaid Parcel Post Plus 5kg Satchel","price":"14.50","max_extra_cover":5000,"options":{"option":[{"code":"AUS_SERVICE_OPTION_STANDARD","name":"Standard Service"},{"code":"AUS_SERVICE_OPTION_REGISTERED_POST","name":"Registered Post","suboptions":{"option":[{"code":"AUS_SERVICE_OPTION_DELIVERY_CONFIRMATION","name":"Delivery Confirmation"},{"code":"AUS_SERVICE_OPTION_PERSON_TO_PERSON","name":"Person to Person"},{"code":"AUS_SERVICE_OPTION_EXTRA_COVER","name":"Extra Cover"}]}},{"code":"AUS_SERVICE_OPTION_COD_POSTAGE_FEES","name":"C.O.D - Postage & Fees"},{"code":"AUS_SERVICE_OPTION_COD_MONEY_COLLECTION","name":"C.O.D - Money Collection, Postage & Fees"}]}},{"code":"AUS_PARCEL_EXPRESS_SATCHEL_5KG","name":"Express Post 5kg Satchel","price":21.65},{"code":"AUS_PARCEL_EXPRESS","name":"Express Post Parcel","price":"30.50"},{"code":"AUS_PARCEL_PLATINUM","name":"Express Post Platinum Parcel","price":"35.90","max_extra_cover":5000,"options":{"option":{"code":"AUS_SERVICE_OPTION_PLATINUM_EXTRA_COVER_SERVICE","name":"Standard cover","suboptions":{"option":{"code":"AUS_SERVICE_OPTION_EXTRA_COVER","name":"Extra Cover"}}}}}]}}

Open in new window

ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of sabecs

ASKER

Thanks for your help, much appreciated.
Thanks for the points! ~Ray