0

嗨,我是 PHP 开发人员的新手

我尝试使用此帮助进行排序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' 
4

3 回答 3

3

在 codeigniter 中,将 callabck 函数输入 PHP 函数需要类似于:

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

显然在适当的地方替换名称。

于 2012-04-13T15:10:15.953 回答
2

您正在写这个: $cmp = $this->_usortByArrayKey($key, $asc, $sort_flags); 但是您的函数_usortByArrayKey接受 5 个必需参数,而您只传递了 3 个。这就是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 出现第一条消息的原因

于 2012-04-13T13:02:28.223 回答
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. getCallback()函数提供可用于调用函数的回调。
于 2012-04-13T13:04:52.210 回答