具有嵌套函数的PHP Hacky代码需要更正

时间:2013-04-26 22:01:53

标签: php closures lambda nested-function

嘿伙计我有一些严重的hacky代码继续使用嵌套函数,但由于某些原因我无法使用闭包或lambda函数使用它,我认为这样会更好,有人会帮我理解我是怎样的可以把它变成一个闭包,lambda或其他东西,以便不用不需要的BS污染我的全局范围??

这是我的两个方法

/**
 * Sort an array of object is ASC order.
 * @param   object  $objArray   An array of objects
 * @return  object  Sorted array of objects
 */
protected function objSort($objArray) 
{
    // turns an Object Array into and Assoc Array
    $array = self::objToArr($objArray);

    // avoid recursively declaring the function
    if (! function_exists('dsort')) 
    {
        // nested functions are stupid.
        function dsort(&$array) 
        {
            foreach ($array AS &$current) 
            {
                if (is_array($current)) dsort($current);
            }
            ksort($array);
        }
    }

    dsort($array);

    // back to an Object Array
    return $objArray = json_decode(json_encode($array));
}

/**
 * Turns an object array into an associative multidimensional array.
 * @param   object  $object     An array of objects
 * @return  array   An associative array    
 */
private static function objToArr($object) 
{
    $array = array();
    $arrayObject = is_object($object) ? get_object_vars($object) : $object;
    foreach ($arrayObject as $key => $value) 
    {
        $value       = (is_array($value) || is_object($value)) ? self::objToArr($value) : $value;
        $array[$key] = $value;
    }
    return $array;
}

它们将获取一个对象数组,按字母顺序将它们按关联数组排序,并将它们作为对象数组返回。

1 个答案:

答案 0 :(得分:1)

我对你在这里尝试做的事情不是很清楚(在每个对象中按名称排序对象属性)。当你谈到污染全局空间时我假设你指的是dsort的实现,这可以使用这个方法包含在类中:

protected static function dsort(&$array) 
{
    foreach ($array AS &$current) 
    {
        if (is_array($current)) dsort($current);
    }
    ksort($array);
}

然后在需要时调用(在用类名替换classname之后)

$dsort = array("classname", "dsort");
$dsort($array);

或者如果您愿意

call_user_func(array("classname","dsort"), $array);