Skip to content

Conversions

These functions are for converting various things.

degreesToDirection

This function converts wind direction from degrees to compass direction.

<?php

function degreesToDirection($degrees) {                 //--------------------------------------------------------------------
        //Convert wind direction from degrees to compass direction.

  if ($degrees == 999) {
            $output = "V";
    } else if ($degrees < 0 or $degrees > 360) {
            $output = "";
    } else if ($degrees <= 33.75 or $degrees >= 326.26) {
            $output =  "N";
    } elseif ($degrees <= 56.25) {
            $output =  "NE";
    } else if ($degrees <= 101.25) {
            $output =  "E";
    } else if ($degrees <= 146.25) {
            $output =  "SE";
    } else if ($degrees <= 191.25) {
            $output =  "S";
    } else if ($degrees <= 236.25) {
            $output =  "SW";
    } else if ($degrees <= 281.25) {
            $output =  "W";
    } else if ($degrees <= 326.25) {
            $output =  "NW";
    } else {
            $output =  "";
    } // end if*/

    return $output; 

} //end function degreesToDirection

?>

xml2array

This function converts the given XML text to an array in the XML structure.

<?php

function xml2array( $contents, $get_attributes = 1, $priority = 'tag' ) {
    /**
     * xml2array() will convert the given XML text to an array in the XML structure.
     * Link: http://www.bin-co.com/php/scripts/xml2array/
     * Arguments : $contents - The XML text
     *                $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
     *                $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance.
     * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
     * Examples: $array =  xml2array(file_get_contents('feed.xml'));
     *              $array =  xml2array(file_get_contents('feed.xml', 1, 'attribute'));
     */
    if ( !$contents ) return array( "Error" => "Empty request" );

    if ( !function_exists( 'xml_parser_create' ) ) {
        //print "'xml_parser_create()' function not found!";
        return array( "Error" => "'xml_parser_create()' function not found!" );
    }

    //Get the XML parser of PHP - PHP must have this module for the parser to work
    $parser = xml_parser_create( '' );
    xml_parser_set_option( $parser, XML_OPTION_TARGET_ENCODING, "UTF-8" ); # http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
    xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
    xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
    xml_parse_into_struct( $parser, trim( $contents ), $xml_values );
    xml_parser_free( $parser );

    if ( !$xml_values ) return; //Hmm...

    //Initializations
    $xml_array = array();
    $parents = array();
    $opened_tags = array();
    $arr = array();

    $current = & $xml_array; //Refference

    //Go through the tags.
    $repeated_tag_index = array(); //Multiple tags with same name will be turned into an array
    foreach ( $xml_values as $data ) {
        unset( $attributes, $value ); //Remove existing values, or there will be trouble

        //This command will extract these variables into the foreach scope
        // tag(string), type(string), level(int), attributes(array).
        extract( $data ); //We could use the array by itself, but this cooler.

        $result = array();
        $attributes_data = array();

        if ( isset( $value ) ) {
            if ( $priority == 'tag' )$result = $value;
            else $result[ 'value' ] = $value; //Put the value in a assoc array if we are in the 'Attribute' mode
        }

        //Set the attributes too.
        if ( isset( $attributes )and $get_attributes ) {
            foreach ( $attributes as $attr => $val ) {
                if ( $priority == 'tag' )$attributes_data[ $attr ] = $val;
                else $result[ 'attr' ][ $attr ] = $val; //Set all the attributes in a array called 'attr'
            }
        }

        //See tag status and do the needed.
        if ( $type == "open" ) { //The starting of the tag '<tag>'
            $parent[ $level - 1 ] = & $current;
            if ( !is_array( $current )or( !in_array( $tag, array_keys( $current ) ) ) ) { //Insert New tag
                $current[ $tag ] = $result;
                if ( $attributes_data )$current[ $tag . '_attr' ] = $attributes_data;
                $repeated_tag_index[ $tag . '_' . $level ] = 1;

                $current = & $current[ $tag ];

            } else { //There was another element with the same tag name

                if ( isset( $current[ $tag ][ 0 ] ) ) { //If there is a 0th element it is already an array
                    $current[ $tag ][ $repeated_tag_index[ $tag . '_' . $level ] ] = $result;
                    $repeated_tag_index[ $tag . '_' . $level ]++;
                } else { //This section will make the value an array if multiple tags with the same name appear together
                    $current[ $tag ] = array( $current[ $tag ], $result ); //This will combine the existing item and the new item together to make an array
                    $repeated_tag_index[ $tag . '_' . $level ] = 2;

                    if ( isset( $current[ $tag . '_attr' ] ) ) { //The attribute of the last(0th) tag must be moved as well
                        $current[ $tag ][ '0_attr' ] = $current[ $tag . '_attr' ];
                        unset( $current[ $tag . '_attr' ] );
                    }

                }
                $last_item_index = $repeated_tag_index[ $tag . '_' . $level ] - 1;
                $current = & $current[ $tag ][ $last_item_index ];
            }

        } elseif ( $type == "complete" ) { //Tags that ends in 1 line '<tag />'
            //See if the key is already taken.
            if ( !isset( $current[ $tag ] ) ) { //New Key
                $current[ $tag ] = $result;
                $repeated_tag_index[ $tag . '_' . $level ] = 1;
                if ( $priority == 'tag'
                    and $attributes_data )$current[ $tag . '_attr' ] = $attributes_data;

            } else { //If taken, put all things inside a list(array)
                if ( isset( $current[ $tag ][ 0 ] )and is_array( $current[ $tag ] ) ) { //If it is already an array...

                    // ...push the new element into that array.
                    $current[ $tag ][ $repeated_tag_index[ $tag . '_' . $level ] ] = $result;

                    if ( $priority == 'tag'
                        and $get_attributes and $attributes_data ) {
                        $current[ $tag ][ $repeated_tag_index[ $tag . '_' . $level ] . '_attr' ] = $attributes_data;
                    }
                    $repeated_tag_index[ $tag . '_' . $level ]++;

                } else { //If it is not an array...
                    $current[ $tag ] = array( $current[ $tag ], $result ); //...Make it an array using using the existing value and the new value
                    $repeated_tag_index[ $tag . '_' . $level ] = 1;
                    if ( $priority == 'tag'
                        and $get_attributes ) {
                        if ( isset( $current[ $tag . '_attr' ] ) ) { //The attribute of the last(0th) tag must be moved as well

                            $current[ $tag ][ '0_attr' ] = $current[ $tag . '_attr' ];
                            unset( $current[ $tag . '_attr' ] );
                        }

                        if ( $attributes_data ) {
                            $current[ $tag ][ $repeated_tag_index[ $tag . '_' . $level ] . '_attr' ] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[ $tag . '_' . $level ]++; //0 and 1 index is already taken
                }
            }

        } elseif ( $type == 'close' ) { //End of tag '</tag>'
            $current = & $parent[ $level - 1 ];
        }
    }

    return ( $xml_array );
}

?>