1

我需要根据来自使用 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 函数的最简单方法是什么?

4

2 回答 2

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());
于 2013-04-03T18:46:58.253 回答
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;
    ...
}
于 2013-04-03T18:29:42.190 回答