2012-04-13 3 views
0

Привет Я newbi в разработчик PHPошибка usort в PHP 5.2

Я пытаюсь разобраться с этой помощью http://www.php.net/manual/en/function.usort.php#103722

function usortByArrayKey($key, $asc=SORT_ASC) { 
$sort_flags = array(SORT_ASC, SORT_DESC); 

if (!in_array($asc, $sort_flags)) 
    throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC'); 

return function(array $a, array $b) use ($key, $asc, $sort_flags) { 
      if (!is_array($key)) { //just one key and sort direction 
       if (!isset($a[$key]) || !isset($b[$key])) { 
        throw new Exception('attempting to sort on non-existent keys'); 
       } 
       if ($a[$key] == $b[$key]) 
        return 0; 
       return ($asc == SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1; 
      } else { //using multiple keys for sort and sub-sort 
       foreach ($key as $sub_key => $sub_asc) { 
        //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which 
        if (!in_array($sub_asc, $sort_flags)) { 
         $sub_key = $sub_asc; 
         $sub_asc = $asc; 
        } 
        //just like above, except 'continue' in place of return 0 
        if (!isset($a[$sub_key]) || !isset($b[$sub_key])) { 
         throw new Exception('attempting to sort on non-existent keys'); 
        } 
        if ($a[$sub_key] == $b[$sub_key]) 
         continue; 
        return ($sub_asc == SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1; 
       } 
       return 0; 
      } 
     }; 

}

проблемы есть, я использую PHP 5.2 затем Я изменяю код как этот

function usortByArrayKey(&$array, $key, $asc=SORT_ASC) { 
    $sort_flags = array(SORT_ASC, SORT_DESC); 
    if(!in_array($asc, $sort_flags)) { 
     throw new InvalidArgumentException('sort flag only accepts SORT_ASC or SORT_DESC'); 
    } 
    $cmp = $this->_usortByArrayKey($key, $asc, $sort_flags); 
    usort($array, $cmp); 
    //return $array; 
} 

function _usortByArrayKey($key, $asc=SORT_ASC, array $sort_flags, array $a, array $b){ 
    if(!is_array($key)) { //just one key and sort direction 
     if(!isset($a[$key]) || !isset($b[$key])) { 
      throw new Exception('attempting to sort on non-existent keys'); 
     } 
     if($a[$key] == $b[$key]) { 
      return 0; 
     } 
     return ($asc==SORT_ASC xor $a[$key] < $b[$key]) ? 1 : -1; 
    } else { //using multiple keys for sort and sub-sort 
     foreach($key as $sub_key => $sub_asc) { 
      //array can come as 'sort_key'=>SORT_ASC|SORT_DESC or just 'sort_key', so need to detect which 
      if(!in_array($sub_asc, $sort_flags)) 
      { 
       $sub_key = $sub_asc; $sub_asc = $asc; 
      } 
      //just like above, except 'continue' in place of return 0 
      if(!isset($a[$sub_key]) || !isset($b[$sub_key])) { 
       throw new Exception('attempting to sort on non-existent keys'); 
      } 
      if($a[$sub_key] == $b[$sub_key]) { 
       continue; 
      } 
      return ($sub_asc==SORT_ASC xor $a[$sub_key] < $b[$sub_key]) ? 1 : -1; 
     } 
     return 0; 
    } 
} 

но я все еще получаю ошибка

ошибка:

Message: Argument 4 passed to ConnectList::_usortByArrayKey() must be an array, none given, called in C:\xampp\htdocs\receiverlist\application\models\connect.php on line 321 and defined 
Uncaught exception 'Exception' with message 'attempting to sort on non-existent keys' 
+0

Ссылка, которую вы даете, выглядит сломанной (у которой есть код, который у вас есть)? Похоже, что он был заменен новой версией. – hakre

ответ

2

вы пишете это: $cmp = $this->_usortByArrayKey($key, $asc, $sort_flags); , но ваша функция _usortByArrayKey принимает 5 необходимые параметры, и вы проходящее только 3. Tha'ts почему первое сообщение Message: Argument 4 passed to ConnectList::_usortByArrayKey() must be an array, none given, called in C:\xampp\htdocs\receiverlist\application\models\connect.php on line 321 and defined появляется

0

Проблема, о которой вы спрашиваете, заключается в том, что вам нужно преобразовать анонимную функцию, которая недоступна в PHP 5.2, в нечто, что работает с PHP 5.2. Функция головки:

function(array $a, array $b) use ($key, $asc, $sort_flags) 

Как это делает использование пункта use, вам нужно будет имитировать это с классом в PHP 5.2. Упрощенный пример:

function ($a) use ($b) 

класс может идти, как это:

class Func 
{ 
    private $b; 
    public function __construct($b) 
    { 
     $this->b = $b; 
    } 
    public function invoke($a) { 
     $b = $this->b; # operate on $b, not $this->b 
    } 
    public function getCallback() { 
     return array($this, 'invoke'); 
    } 
} 

Как это работает? Пример использования:

$func = new Func($b); 
return $func->getCallback(); 

Что такое шаблон?

  1. Вы создаете новый класс, который представляет функцию.
  2. Переменные из предложения use являются параметрами конструктора.
  3. Вы создаете функцию invoke, которая представляет функцию.
  4. Внутри функции invoke все переменные-переменные копируются в локальную область.
  5. a getCallback() Функция обеспечивает обратный вызов, который вы можете использовать для вызова функции.
+0

благодарю hakre, что это работа для меня :) –

3

В CodeIgniter, чтобы ввести функцию callabck в функции PHP является должно быть что-то вроде:

usort($array, array('name-of-controller', 'name-of-method')); 

Очевидно заменяя имена в соответствующих случаях.

Смежные вопросы