Хакерский код PHP с вложенными функциями нуждается в исправлении

Эй, ребята, у меня есть какой-то серьезно хакерский код с вложенной функцией, но я не могу заставить его работать по какой-то причине ни с замыканиями, ни с лямбда-функциями, что, как я полагаю, было бы предпочтительнее, может кто-нибудь помочь мне понять, как я могу это повернуть в замыкание, лямбду или что-то еще, чтобы НЕ загрязнять мою глобальную область ненужными Б.С. ??

Вот мои два метода

/**
 * 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;
}

Они будут принимать массив объектов, сортировать их в алфавитном порядке как ассоциативный массив и возвращать их как массив объектов.


person ehime    schedule 26.04.2013    source источник


Ответы (1)


Я не очень понимаю, что вы пытаетесь здесь сделать (сортировать свойства объектов по имени внутри каждого объекта). Когда вы говорите о загрязнении глобального пространства, я предполагаю, что вы имеете в виду реализацию dsort, это может содержаться в классе с использованием этого метода:

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

затем вызывается при необходимости (после замены имени класса на имя класса) с помощью

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

или если вы предпочитаете

call_user_func(array("classname","dsort"), $array);
person Orangepill    schedule 30.05.2013
comment
Некоторое время назад я нашел другой способ, но это хороший ответ, спасибо. Принято и добавлено - person ehime; 31.05.2013