如何将一个额外的变量传递给cmp函数,以便在php中使用usort

时间:2013-04-03 18:23:53

标签: php sorting php4 usort

我需要使用基于使用php4的mysql调用的文本字符串的usort来命令一个数组。

到目前为止,我已经通过mysql调用来获取订单:

$result=mysql_query("SELECT rank from order WHERE id=1");
$row = mysql_fetch_row($result);

这给了我一些像$ row [0] ='Alberto,Carlos,Brocephus,Edgar,Daniela';

我有这个功能,如果我在数组中硬编码就可以了:

function cmp($a,$b){
    //$order = how do I get $row[0] in here?
    $a_index = array_search($a['name'], $order);
    if (!$a_index) {
        $a_index = 999;
    }
    $b_index = array_search($b['name'], $order);
    if (!$b_index) {
        $b_index = 999;
    }
    return $a_index - $b_index;
}
usort($names,cmp);

将字符串作为数组放入cmp函数的最简单方法是什么?

2 个答案:

答案 0 :(得分:4)

您不能在PHP 4中使用闭包,但可以使用对象。

class ArrayComparer {

    var $indexedarray;

    function ArrayComparer($str) {
        $this->indexedarray = array_flip(explode(', ', $str));
    }

    function cmp($a, $b) {
        $a = $a['name'];
        $b = $b['name'];
        $a_index = (isset($this->indexedarray[$a])) ? $this->indexedarray[$a] : 0x7fffffff;
        $b_index = (isset($this->indexedarray[$b])) ? $this->indexedarray[$b] : 0x7fffffff;
        return $a_index - $b_index;
    }

    function callback() {
        return array($this, 'cmp');
    }
}

使用示例:

$cmp = new ArrayComparer('Alberto, Carlos, Brocephus, Edgar, Daniela');
usort($names, $cmp->callback());

答案 1 :(得分:0)

如果您使用的是现代版本的PHP,则可以像这样使用use关键字:

function cmp($a, $b) use $your_string {
    ...
}

或者像use这样使用闭包:

usort(function($a, $b) use $your_string {
    ...
});

但是,由于您使用的是古老版本的PHP,因此可能不得不求助于使用全局声明

function cmp($a, $b) {
    global $your_string;
    ...
}