recursively find all array values - php

So I have a big response from an API in a multi-dimensional array, and I need to find all the instances of a certain key->value pair, specifically ['type'] => PhotoField My task would be easy if they were all the same depth, but they vary, so I am using a recursive function to get all the key value pairs of a specific value. I have morphed a standard recursive array searching algorithm for my purposes. But I still have the problem that when it pushes the path of each instance to the $path array, it just merges to the path of the previous instance.
What I really need is for each instance's path to be a subarray within $path.
Here is my function:
function array_searchRecursive($needle, $haystack, $strict=false, $path=array() )
{
if(!array_key_exists('elements', $haystack)) {
return false;
}
foreach( $haystack['elements'] as $key => $val ) {
if( is_array($val) && $subPath = array_searchRecursive($needle, $val, $strict, $path) ) {
$path = array_merge($path, array($key), $subPath);
return $path;
} elseif( (!$strict && $val['type'] == $needle) || ($strict && $val['type'] === $needle) ) {
$path[] = $val['key'];
}
}
if (!(empty($path))){
return $path;
}
return false;
}
I call it with:
array_searchRecursive($resp['form']);
And here is some sample data:
$resp =
Array
(
[form] => Array
(
[name] => Site Inspection
[elements] => Array
(
[0] => Array
(
[type] => Section
[key] => 86d2
[elements] => Array
(
[0] => Array
(
[type] => ChoiceField
[key] => 450c
)
)
)
[1] => Array
(
[type] => Section
[key] => 6021
[elements] => Array
(
[0] => Array
(
[type] => TextField
[key] => c8e5
)
[1] => Array
(
[type] => PhotoField
[key] => 01dd
[label] => Photos of Protective Structure
)
[2] => Array
(
[type] => PhotoField
[key] => 8e1c
[label] => Photos of Degradation to Protective Structures
)
)
)
[2] => Array
(
[type] => Section
[key] => 9335
[elements] => Array
(
[0] => Array
(
[type] => TextField
[key] => b614
)
[1] => Array
(
[type] => Repeatable
[key] => 6b00
(
[0] => Array
(
[type] => TextField
[key] => b646
)
[1] => Array
(
[type] => PhotoField
[key] => 9747
)
)
)
)
)
)
)
Sincere thanks for any help. It is greatly appreciated.

This should work:
foreach($resp['form']['elements'] as $v)
{
if($v['type'] === 'PhotoField')
{
// we found it!
}
}

Related

Searching in array return wrong result

I have received array like this
Array
(
[hash] => 9761d3233f9cb256c0992be
[total] => 2736712601
[received] => 2017-01-13T21:43:32.047Z
[income] => Array
(
[0] => Array
(
[value] => 647262
[addresses] => Array
(
[0] => Address_1
)
)
[1] => Array
(
[value] => 17200000
[addresses] => Array
(
[0] => Address_2
)
)
[2] => Array
(
[value] => 3729034
[addresses] => Array
(
[0] => Address_3
)
)
[3] => Array
(
[value] => 2414997500
[addresses] => Array
(
[0] => Address_4
)
)
[4] => Array
(
[value] => 10856454
[addresses] => Array
(
[0] => Address_5
)
)
)
)
So in my database I store the hash (9761d3233f9cb256c0992be). The I hash and the address. Then based on them I match the correct array from [income]. When I found correct address in income I take the [value] and showing it on the page. Here is how I've made it
$url=get_curl_content("https://example.com/".$order->hash);
$totala =json_decode($url,true);
....
$match = true;
foreach ($totala['income'] as $data) {
if ($data['addresses'] == $order->address) {
$match = $data;
break;
}
}
$price = $data['value'];
The problem is that I'm expecting Address_2 because in database i have saved Address_2 I've got Address_3 instead.
When I var_dump($data['addresses']) i got Address_3. What can be the problem?
Try like this. It will search and match in array using in_array function
$match = true;
foreach ($totala['income'] as $data) {
if (in_array($order->address, $data['addresses'])) {
$match = $data;
break;
}
}
$price = $match['value'];

Search value in multidimension array and keep keys association

I have this array converted from xml of webservice. I have 500 items in this array.
I want to search any value and return all found array items with key association ( similar to database select query ). So if I search 'dummy' then it should return first item of this array.
Array
(
[12.12.2014] => Array
(
[7] => Array
(
[id] => 1672
[date] => 12.12.2014
[description] => rummy dummy data
[room] => delux
[Type] => garden
[from] => 17:00
[to] => 17:45
[assets] => Array
(
[asset] => Array
(
[0] => Array
(
[number] => 5275
[detail] => primary one
)
[1] => Array
(
[number] => 19
[detail] => secondary one
)
)
)
[references] => Array
(
[reference] => Array
(
[personnumber] => 479470
[type] => worker
[name] => David
[department] => Sales
[cv] => Array
(
[pdetails] => follow later
)
[profile] => True
)
)
)
)
[13.12.2014] => Array
(
[17] => Array
(
[id] => 1672
[date] => 13.12.2014
[description] => brown fox jump
[room] => star
[Type] => city
[from] => 17:00
[to] => 17:45
[assets] => Array
(
[asset] => Array
(
[number] => 5275
[detail] => prime two
)
)
[references] => Array
(
[reference] => Array
(
[personnumber] => 479470
[type] => manager
[name] => Albert
[department] => Purchase
[cv] => Array
(
[pdetails] => follow later
)
[profile] => True
)
)
)
)
)
I tried stripos to search string in array value and in_array based functions but either it gives incorrect result or key association is not maintained.
I am unable to find a way to maintain key->value.
function search($array, $key, $value)
{
$results = array();
if (is_array($array))
{
if (isset($array[$key]) && $array[$key] == $value)
$results[] = $array;
foreach ($array as $subarray)
$results = array_merge($results, search($subarray, $key, $value));
}
return $results;
}
This may be worst function you have ever seen but this do the job. If some one can make it recursive ( array may be further deeper ).
function search_in_multi_array($srchvalue, $array)
{
$foundkey = '';
if (is_array($array) && count($array) > 0)
{
foreach($array as $pkey => $pvalue)
{
foreach($pvalue as $ckey => $cvalue)
{
if (is_array($cvalue) && count($cvalue) > 0)
{
if(in_array($srchvalue,$cvalue))
{
$foundkey[$pkey][$ckey] = $cvalue;
}
foreach($cvalue as $dkey => $dvalue)
{
if(!is_array($dvalue))
{
$pos = stripos($dvalue, $srchvalue);
if ($pos !== false)
{
$foundkey[$pkey][$ckey] = $cvalue;
}
}
}
}
}
}
}
return $foundkey;
}
Function call -
$needle = 'fox';
search_in_multi_array($needle, $my_array);
This is the output
Array
(
[13.12.2014] => Array
(
[17] => Array
(
[id] => 1672
[date] => 13.12.2014
[description] => brown fox jump
[room] => star
[Type1] => city
[from] => 17:00
[to] => 17:45
[assets] => Array
(
[asset] => Array
(
[number] => 5275
[detail] => prime two
)
)
[references] => Array
(
[reference] => Array
(
[personnumber] => 479470
[Type1] => manager
[name] => Albert
[department] => Purchase
[cv] => Array
(
[pdetails] => follow later
)
[profile] => 1
)
)
)
)
)
You can use array_search() function to look through the array values. But array_search only looks in single-dimensional array.
Since you have a multi-dimensional array, you can write custom recursive function to search recursively in the array
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
But please note, using array_search() is a easier approach but not a optimised function. Which means if you're more concerned about your memory utilisation then I would also addtionally suggest.
Create a new array say 'dictionary' and store them like
$dictonary[<key-searched>] = array('12.12.2014', '13.12.2014')
So you process them once, and cache them
So next time when you want search again for the same key, you can first check if the key exists in dictionary. If exists return from there, else use array_search and cache the results in dictionary
Its always easier to search by key-value than to search in a multi-dimensional array.
I've made a simple routine that will extract the values in the array you're looking for:
function search_keys($needle,$haystack)
{
foreach($haystack as $key => $value)
{
if (is_array($value)) $output[$key] = search_keys($needle,$value);
else if (strpos($value,$needle) !== FALSE) $output[$key] = $value;
}
return isset($output) ? $output : NULL; // prevent warning
}
echo '<pre>';
print_r(search_keys('garden',$data));
echo '</pre>';
This will return 'garden' as:
Array
(
[12.12.2014] => Array
(
[7] => Array
(
[Type] => garden
)
)
)
You can further process the output of this function, or change the function, as needed.
You may want to have a look at XPath to run queries against the "raw" XML, see DOMXPath for example.
Something like /myRootTag/someDayTag[.//text()[contains(.,'MY_SEARCH_VALUE')]] should do the trick, selecting and returning all the someDayTag XML elements below the myRootTag which have the text MY_SEARCH_VALUE in any child node.

How to remove branches that don't contain a certain value in a php array

I've spent the day playing with deceze's answer but I'm no closer to making it work. I may have part of it, but not sure how to get recursion in array_filter.
My Array looks like this (sample):
Array
(
[name] => root
[ChildCats] => Array
(
[0] => Array
(
[name] => Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Ducted Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Supply & Install
[ChildCats] => Array
(
[0] => Array
(
[name] => Daiken
[S] => 6067
)
)
)
[1] => Array
(
[name] => Supply Only
[ChildCats] => Array
(
[0] => Array
(
[name] => Mitsubishi
[S] => 6026
)
)
)
)
)
[1] => Array
(
[name] => Split System Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Supply & Install
[ChildCats] => Array
(
[0] => Array
(
[name] => Daiken
[S] => 6067
)
[1] => Array
(
[name] => Fujitsu Split Air Conditioning Systems
[S] => 6464
)
[2] => Array
(
[name] => Mitsubishi Electric Split Air Conditioning Systems
[S] => 6464
)
)
)
)
)
)
)
[1] => Array
(
[name] => Appliance / White Goods
[ChildCats] => Array
(
[0] => Array
(
[name] => Clearance
[S] => 6239
)
[1] => Array
(
[name] => Cooktops
[ChildCats] => Array
(
[0] => Array
(
[name] => Ceramic Cooktops
[S] => 6239
)
[1] => Array
(
[name] => Element Cooktops
[S] => 6067
)
[2] => Array
(
[name] => Gas Cooktops
[S] => 6239
)
[3] => Array
(
[name] => Induction Cooktops
[S] => 6239
)
)
)
)
)
Now lets say I try to extract just the parts of the array relevent to the following keypair:
S => 6067.
I'd like the result to look like:
Array
(
[name] => root
[ChildCats] => Array
(
[0] => Array
(
[name] => Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Ducted Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Supply & Install
[ChildCats] => Array
(
[0] => Array
(
[name] => Daiken
[S] => 6067
)
)
)
)
)
[1] => Array
(
[name] => Split System Air Conditioning
[ChildCats] => Array
(
[0] => Array
(
[name] => Supply & Install
[ChildCats] => Array
(
[0] => Array
(
[name] => Daiken
[S] => 6067
)
)
)
)
)
)
)
[1] => Array
(
[name] => Appliance / White Goods
[ChildCats] => Array
(
[0] => Array
(
[name] => Cooktops
[ChildCats] => Array
(
[0] => Array
(
[name] => Element Cooktops
[S] => 6067
)
)
)
)
)
)
)
What I cannot get my head arround is should I be creating a new array or using array filter.
Playing with deceze code I've got the search working using the following:
function recursive_assoc_in_array(array $haystack, array $needle, $childKey = 'ChildCats') {
if (array_intersect_assoc($haystack, $needle)) {
echo "Found via array_intersect_assoc ".$haystack[name]."\n";
return true;
}
foreach ($haystack[$childKey] as $child) {
if (recursive_assoc_in_array($child, $needle, $childKey)) return true;
}
return false;
}
But if I try to process with,
$array = array_filter($array, function (array $values) {
return recursive_assoc_in_array($values, array('S' => '6067'));
});
I get the original array which leads me to think I have to get recursion running on the array_filter query.
At this point I just go blank.
Additionally, the array keys will need to be reindexed on the produced new array. Any ideas?
--Additional 7/7/14
How about if I try to build a new array from the old one?
I'm trying:
function exploreArrayandAdd($Array) {
if ($Array['ChildCats']) {
foreach ($Array['ChildCats'] as $key => $value) {
$NewArray['ChildCats'][] = exploreArrayandAdd($value);
}
} else {
if ($Array['S'] == 6026) {
//echo "1";
return $Array;
}
}
}
But cannot work out how to pass the new array out of the function?
Tried removing branches that don't match using:
function exploreArray(&$Array) {
if ($Array['ChildCats']) {
foreach ($Array['ChildCats'] as $key => $value) {
$result = exploreArray($Array['ChildCats'][$key]);
if ($result === false)
unset($Array['ChildCats'][$key]);
}
} else {
// print_r($Array);
if ($Array['S'] == 6026) {
return true;
} else {
unset($Array);
return false;
}
}
//if ($NoChildCat==true) print_r($Array);
}
But I believe it is the wrong way as it does work at the bottom of the array but not back up towards the top as siblings make result true.
Also this won't reindex the array keys.
function recursive_array_filter(array $array, $childKey, callable $test) {
if (isset($array[$childKey]) && is_array($array[$childKey])) {
foreach ($array[$childKey] as $key => &$child) {
if (!$child = recursive_array_filter($child, $childKey, $test)) {
unset($array[$childKey][$key]);
}
}
if (!$array[$childKey]) {
unset($array[$childKey]);
}
}
return !empty($array[$childKey]) || $test($array) ? $array : [];
}
$array = recursive_array_filter($array, 'ChildCats', function (array $array) {
return array_intersect_assoc($array, ['S' => 6026]);
});
To express the algorithm in words: you descend down into the array first, following all ChildCats branches to their end. In each level you return the values as they are back to the caller if they match your test or if they have children, or you return an emptied array (you could also return false if you prefer). If some child turns out empty, you prune it with unset.
I have implemented the test as a callback function here for best reusability of the code.

How to access a specific key from an associative array in PHP?

I'm a newbie to this associative array concept in PHP. Now I'm having an array named $sample as follows:
Array
(
[name] => definitions
[text] =>
[attributes] => Array
(
[name] => Mediation_Soap_Server_Reporting
[targetnamespace] => https://mediation.moceanmobile.net/soap/reporting
)
[children] => Array
(
[types] => Array
(
[0] => Array
(
[name] => types
[text] =>
[attributes] => Array
(
)
[children] => Array
(
[xsd:schema] => Array
(
[0] => Array
(
[name] => schema
[text] =>
[attributes] => Array
(
[targetnamespace] => https://mediation.moceanmobile.net/soap/reporting
)
[children] => Array
(
[xsd:complextype] => Array
(
[0] => Array
(
[name] => complextype
[text] =>
[attributes] => Array
(
[name] => Mediation_Soap_FaultMessage
)
[children] => Array
(
[xsd:sequence] => Array
(
[0] => Array
(
[name] => sequence
[text] =>
[attributes] => Array
(
)
)
)
)
)
)
)
)
)
)
)
)
)
)
From the above array I want to refer(or access) to the key xsd:schema. But I'm not able to do it. Can you please tell me how should I access or refer this key from the associative array names $sample? Thanks in advance.
To access this value you would use:-
$sample['children']['types'][0]['children']['xsd:schema'];
If you have multiple of these elements in your types array you will need to loop through them:-
foreach($sample['children']['types'] as $type) {
if(isset($type['children']) && isset($type['children']['xsd:schema'])) {
// Perform action on element
$type['children']['xsd:schema'];
}
}
If you do not know your structure (as in xsd:schema can occur outside of types) then you will need to write a recursive function or loop for finding it.
I guess your goal is to seek for the key/value pair where the key is "xsd" ?
If so, in PHP, you can do so by using the follwing logic:
while (list($key, $value) = each($arr)) {
echo "Key: $key; Value: $value<br />\n";
}
// OR
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br />\n";
}
Just add a set of recursing or nested loops to traverse the structure until you find the proper key.

What to use for XML parsing / reading in PHP4

Unfortunatly I have to work in a older web application on a PHP4 server;
It now needs to parse a lot of XML for calling webservices (custom protocol, no SOAP/REST);
Under PHP5 I would use SimpleXML but that isn't available;
There is Dom XML in PHP4, but it isn't default any more in PHP5.
What are the other options?
I'm looking for a solution that still works on PHP5 once they migrate.
A nice extra would be if the XML can be validated with a schema.
There is a simpleXML backport avaliable: http://www.ister.org/code/simplexml44/index.html
If you can install that, then that will be the best solution.
I would second Rich Bradshaw's suggestion about the simpleXML backport, but if that's not an option, then xml_parse will do the job in PHP4, and still works after migration to 5.
$xml = ...; // Get your XML data
$xml_parser = xml_parser_create();
// _start_element and _end_element are two functions that determine what
// to do when opening and closing tags are found
xml_set_element_handler($xml_parser, "_start_element", "_end_element");
// How to handle each char (stripping whitespace if needs be, etc
xml_set_character_data_handler($xml_parser, "_character_data");
xml_parse($xml_parser, $xml);
There's a good tutorial here about parsing XML in PHP4 that may be of some use to you.
It might be a bit grass roots, but if it's applicable for the data you're working with, you could use XSLT to transform your XML in to something usable. Obviously once you upgrade to PHP5 the XSLT will still work and you can migrate as and when to DOM parsing.
Andrew
If you can use xml_parse, then go for that. It's robust, fast and compatible with PHP5. It is however not a DOM parser, but a simpler event-based one (Also called a SAX parser), so if you need to access a tree, you will have to marshal the stream into a tree your self. This is fairly simple to do; Use s stack, and push items to it on start-element and pop on end-element.
I would definitely recommend the SimpleXML backport, as long as its performance is good enough for your needs. The demonstrations of xml_parse look simple enough, but it can get very hairy very quickly in my experience. The content handler functions don't get any contextual information about where the parser is in the tree, unless you track it and provide it in the start and end tag handlers. So you're either calling functions for every start/end tag, or throwing around global variables to track where you are in the tree.
Obviously the SimpleXML backport will be a bit slower, as it's written in PHP and has to parse the whole document before it's available, but the ease of coding more than makes up for it.
Maybe also consider looking at the XML packages available in PEAR, particularly XML_Util, XML_Parser, and XML_Serializer...
XML Parser with parse_into_struct turned into a tree-array structure:
<?php
/**
* What to use for XML parsing / reading in PHP4
* #link http://stackoverflow.com/q/132233/367456
*/
$encoding = 'US-ASCII';
// https://gist.github.com/hakre/46386de578619fbd898c
$path = dirname(__FILE__) . '/time-series-example.xml';
$parser_creator = 'xml_parser_create'; // alternative creator is 'xml_parser_create_ns'
if (!function_exists($parser_creator)) {
trigger_error(
"XML Parsers' $parser_creator() not found. XML Parser "
. '<http://php.net/xml> is required, activate it in your PHP configuration.'
, E_USER_ERROR
);
return;
}
$parser = $parser_creator($encoding);
if (!$parser) {
trigger_error(sprintf('Unable to create a parser (Encoding: "%s")', $encoding), E_USER_ERROR);
return;
}
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
$data = file_get_contents($path);
if ($data === FALSE) {
trigger_error(sprintf('Unable to open file "%s" for reading', $path));
return;
}
$result = xml_parse_into_struct($parser, $data, $xml_struct_values);
unset($data);
xml_parser_free($parser);
unset($parser);
if ($result === 0) {
trigger_error(sprintf('Unable to parse data of file "%s" as XML', $path));
return;
}
define('TREE_NODE_TAG', 'tagName');
define('TREE_NODE_ATTRIBUTES', 'attributes');
define('TREE_NODE_CHILDREN', 'children');
define('TREE_NODE_TYPE_TAG', 'array');
define('TREE_NODE_TYPE_TEXT', 'string');
define('TREE_NODE_TYPE_NONE', 'NULL');
/**
* XML Parser indezies for parse into struct values
*/
define('XML_STRUCT_VALUE_TYPE', 'type');
define('XML_STRUCT_VALUE_LEVEL', 'level');
define('XML_STRUCT_VALUE_TAG', 'tag');
define('XML_STRUCT_VALUE_ATTRIBUTES', 'attributes');
define('XML_STRUCT_VALUE_VALUE', 'value');
/**
* XML Parser supported node types
*/
define('XML_STRUCT_TYPE_OPEN', 'open');
define('XML_STRUCT_TYPE_COMPLETE', 'complete');
define('XML_STRUCT_TYPE_CDATA', 'cdata');
define('XML_STRUCT_TYPE_CLOSE', 'close');
/**
* Tree Creator
* #return array
*/
function tree_create()
{
return array(
array(
TREE_NODE_TAG => NULL,
TREE_NODE_ATTRIBUTES => NULL,
TREE_NODE_CHILDREN => array(),
)
);
}
/**
* Add Tree Node into Tree a Level
*
* #param $tree
* #param $level
* #param $node
* #return array|bool Tree with the Node added or FALSE on error
*/
function tree_add_node($tree, $level, $node)
{
$type = gettype($node);
switch ($type) {
case TREE_NODE_TYPE_TEXT:
$level++;
break;
case TREE_NODE_TYPE_TAG:
break;
case TREE_NODE_TYPE_NONE:
trigger_error(sprintf('Can not add Tree Node of type None, keeping tree unchanged', $type, E_USER_NOTICE));
return $tree;
default:
trigger_error(sprintf('Can not add Tree Node of type "%s"', $type), E_USER_ERROR);
return FALSE;
}
if (!isset($tree[$level - 1])) {
trigger_error("There is no parent for level $level");
return FALSE;
}
$parent = & $tree[$level - 1];
if (isset($parent[TREE_NODE_CHILDREN]) && !is_array($parent[TREE_NODE_CHILDREN])) {
trigger_error("There are no children in parent for level $level");
return FALSE;
}
$parent[TREE_NODE_CHILDREN][] = & $node;
$tree[$level] = & $node;
return $tree;
}
/**
* Creator of a Tree Node
*
* #param $value XML Node
* #return array Tree Node
*/
function tree_node_create_from_xml_struct_value($value)
{
static $xml_node_default_types = array(
XML_STRUCT_VALUE_ATTRIBUTES => NULL,
XML_STRUCT_VALUE_VALUE => NULL,
);
$orig = $value;
$value += $xml_node_default_types;
switch ($value[XML_STRUCT_VALUE_TYPE]) {
case XML_STRUCT_TYPE_OPEN:
case XML_STRUCT_TYPE_COMPLETE:
$node = array(
TREE_NODE_TAG => $value[XML_STRUCT_VALUE_TAG],
// '__debug1' => $orig,
);
if (isset($value[XML_STRUCT_VALUE_ATTRIBUTES])) {
$node[TREE_NODE_ATTRIBUTES] = $value[XML_STRUCT_VALUE_ATTRIBUTES];
}
if (isset($value[XML_STRUCT_VALUE_VALUE])) {
$node[TREE_NODE_CHILDREN] = (array)$value[XML_STRUCT_VALUE_VALUE];
}
return $node;
case XML_STRUCT_TYPE_CDATA:
// TREE_NODE_TYPE_TEXT
return $value[XML_STRUCT_VALUE_VALUE];
case XML_STRUCT_TYPE_CLOSE:
return NULL;
default:
trigger_error(
sprintf(
'Unkonwn Xml Node Type "%s": %s', $value[XML_STRUCT_VALUE_TYPE], var_export($value, TRUE)
)
);
return FALSE;
}
}
$tree = tree_create();
while ($tree && $value = array_shift($xml_struct_values)) {
$node = tree_node_create_from_xml_struct_value($value);
if (NULL === $node) {
continue;
}
$tree = tree_add_node($tree, $value[XML_STRUCT_VALUE_LEVEL], $node);
unset($node);
}
if (!$tree) {
trigger_error('Parse error');
return;
}
if ($xml_struct_values) {
trigger_error(sprintf('Unable to process whole parsed XML array (%d elements left)', count($xml_struct_values)));
return;
}
// tree root is the first child of level 0
print_r($tree[0][TREE_NODE_CHILDREN][0]);
Output:
Array
(
[tagName] => dwml
[attributes] => Array
(
[version] => 1.0
[xmlns:xsd] => http://www.w3.org/2001/XMLSchema
[xmlns:xsi] => http://www.w3.org/2001/XMLSchema-instance
[xsi:noNamespaceSchemaLocation] => http://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd
)
[children] => Array
(
[0] => Array
(
[tagName] => head
[children] => Array
(
[0] => Array
(
[tagName] => product
[attributes] => Array
(
[srsName] => WGS 1984
[concise-name] => time-series
[operational-mode] => official
)
[children] => Array
(
[0] => Array
(
[tagName] => title
[children] => Array
(
[0] => NOAA's National Weather Service Forecast Data
)
)
[1] => Array
(
[tagName] => field
[children] => Array
(
[0] => meteorological
)
)
[2] => Array
(
[tagName] => category
[children] => Array
(
[0] => forecast
)
)
[3] => Array
(
[tagName] => creation-date
[attributes] => Array
(
[refresh-frequency] => PT1H
)
[children] => Array
(
[0] => 2013-11-02T06:51:17Z
)
)
)
)
[1] => Array
(
[tagName] => source
[children] => Array
(
[0] => Array
(
[tagName] => more-information
[children] => Array
(
[0] => http://www.nws.noaa.gov/forecasts/xml/
)
)
[1] => Array
(
[tagName] => production-center
[children] => Array
(
[0] => Meteorological Development Laboratory
[1] => Array
(
[tagName] => sub-center
[children] => Array
(
[0] => Product Generation Branch
)
)
)
)
[2] => Array
(
[tagName] => disclaimer
[children] => Array
(
[0] => http://www.nws.noaa.gov/disclaimer.html
)
)
[3] => Array
(
[tagName] => credit
[children] => Array
(
[0] => http://www.weather.gov/
)
)
[4] => Array
(
[tagName] => credit-logo
[children] => Array
(
[0] => http://www.weather.gov/images/xml_logo.gif
)
)
[5] => Array
(
[tagName] => feedback
[children] => Array
(
[0] => http://www.weather.gov/feedback.php
)
)
)
)
)
)
[1] => Array
(
[tagName] => data
[children] => Array
(
[0] => Array
(
[tagName] => location
[children] => Array
(
[0] => Array
(
[tagName] => location-key
[children] => Array
(
[0] => point1
)
)
[1] => Array
(
[tagName] => point
[attributes] => Array
(
[latitude] => 40.00
[longitude] => -120.00
)
)
)
)
[1] => Array
(
[tagName] => moreWeatherInformation
[attributes] => Array
(
[applicable-location] => point1
)
[children] => Array
(
[0] => http://forecast.weather.gov/MapClick.php?textField1=40.00&textField2=-120.00
)
)
[2] => Array
(
[tagName] => time-layout
[attributes] => Array
(
[time-coordinate] => local
[summarization] => none
)
[children] => Array
(
[0] => Array
(
[tagName] => layout-key
[children] => Array
(
[0] => k-p24h-n4-1
)
)
[1] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-02T08:00:00-07:00
)
)
[2] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-02T20:00:00-07:00
)
)
[3] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-03T07:00:00-08:00
)
)
[4] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-03T19:00:00-08:00
)
)
[5] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-04T07:00:00-08:00
)
)
[6] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-04T19:00:00-08:00
)
)
[7] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-05T07:00:00-08:00
)
)
[8] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-05T19:00:00-08:00
)
)
)
)
[3] => Array
(
[tagName] => time-layout
[attributes] => Array
(
[time-coordinate] => local
[summarization] => none
)
[children] => Array
(
[0] => Array
(
[tagName] => layout-key
[children] => Array
(
[0] => k-p24h-n5-2
)
)
[1] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-01T20:00:00-07:00
)
)
[2] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-02T09:00:00-07:00
)
)
[3] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-02T19:00:00-07:00
)
)
...
[10] => Array
(
[tagName] => end-valid-time
[children] => Array
(
[0] => 2013-11-06T08:00:00-08:00
)
)
)
)
[4] => Array
(
[tagName] => time-layout
[attributes] => Array
(
[time-coordinate] => local
[summarization] => none
)
[children] => Array
(
[0] => Array
(
[tagName] => layout-key
[children] => Array
(
[0] => k-p12h-n9-3
)
)
[1] => Array
(
[tagName] => start-valid-time
[children] => Array
(
[0] => 2013-11-01T17:00:00-07:00
)
)
...

Categories