Blog

Neuigkeiten, Interessantes und Informatives

November 2, 2010

Array Map Recursive

Diese Funktion array_map ermöglicht zum Beispiel die Bereinigung von POST-Variablen in dem verschiedene Callback-Funktionen auf das Array angewendet werden können. Das aber nur bedingt dynamisch, denn das Array darf nur eindimensional sein. Seit PHP 5.x besteht die Möglichkeit auch mehrdimensionale Arrays mit der Funktion array_walk_recursive zu durchlaufen. Für PHP Versionen kleiner 5.x habe ich folgenden Snippet geschrieben.

< ?php
/**
 * @category helpful utilities
 * @package utilities
 * @subpackage mapping
 * @version $Id: v0.2 2010/11/01 09:43:03 mitopp Exp $
 * @author (c) michael topp <post (at) toppsolutions (dot) de>
 * @copyright (c) 2010 toppsolutions.de
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 * @param mixed $mixCallback
 * @param array $arrData
 * @access public
 * @return array
 */
function array_map_recursive( $mixCallback, array $arrData )
{
    // array of callback functions
    if ( is_array( $mixCallback ) )
    {
        foreach ( $mixCallback as $strCallback )
        {
            $arrData = array_map_recursive( $strCallback , $arrData );
        }
        return $arrData;
    }
    else
    {
        // callback function
        try
        {
            $arrArgs = func_get_args();
            $intNumArgs = func_num_args();
            $mixCallback = array_shift( $arrArgs );
            if ( $intNumArgs == 2 )
            {
                foreach ( $arrArgs[0] as $key => $value )
                {
                    if ( is_array( $value ) ) $return[$key] = array_map_recursive( $mixCallback, $value );
                    else $return[$key] = call_user_func( $mixCallback, $value );
                }
            }
            else
            {
                foreach ( $arrArgs as $index => $array )
                {
                    foreach ( $array as $key => $value )
                    {
                        if ( is_array( $value ) ) $returns[$key] = array_map_recursive( $mixCallback, $value );
                        else $returns[$key] = call_user_func( $mixCallback, $value );
                    }
                    $return[] = $returns;
                }
            }
            return $return;
        }
        catch (Exception $e)
        {
            $trace = $e->getTrace();
            exit('<b>Warning: </b>' . $e->getMessage() . " in <b>" . $trace[0]['file'] . "</b> on line <b>" . $trace[0]['line'] . "</b>");
        }
    }
}
?>
keine Kommentare geposted in: Code   |   PHP
Tags:
, ,