PHP - 数组排序

3

我想根据用户的选择对数组进行排序,我已经成功地完成了所有操作(在你们一些人的帮助下),现在我正在尝试清理代码。以下是我的代码:

//Global Sorting Functions (For Rows to Columns)
//Function to sort up or down
function cmpdwn($a, $b) {
    return strcasecmp($a["Name"], $b["Name"]);
}

function cmpup($a, $b, $c) {
    return strcasecmp($b[$c], $a[$c]);
}

//Name Ordering Function ---------------------------------
function nameorder($data) {
    //If Up sorts Assending if Down Decending
    if ($_POST['Sortby'] == "NameDown") {
        uasort($data, "cmpdwn");
    } else {
        uasort($data, "cmpup");
    }

    $nameorder = array();
    $count = 0;
    while (list($key, $value) = each($data)) {
        $nameorder[$count] = $key;
        $count++;
    }
    return $nameorder;
}

这将创建一个数组,以便按名称顺序打印数据。我还想重复这个过程以获取电子邮件和其他信息。我的想法是通过将更多的$a和$b放入(即 $c =“Name”,然后我可以放入“Email”或任何// cmpup作为示例)来重复使用“cmp”函数。但是据我所知,这个函数正在为uasort声明参数,并且我没有将变量送入其中的方法。是否有一种方法可以这样做,还是必须反复重写该函数?
谢谢 爱你哟

1
为了提高你的代码,我猜想http://codereview.stackexchange.com/是更好的询问之处 :) - ariefbayu
下次注意,谢谢。 - user3596598
2个回答

2
尝试创建对象
class MyComparator {

    private $key;

    function __construct($key) {
        $this->key = $key;
    }

    function compare($a, $b) {
        return strcasecmp($b[$this->key], $a[$this->key]);
    }

    public function setKey($key) {
        $this->key = $key;
    }
}

并使用它

$compararor = new MyComparator("Name");

usort($data, array($compararor, "compare"));


OR在PHP >= 5.3.0中,您可以使用__invoke()方法。

class MyComparator {

    private $key;

    function __construct($key) {
        $this->key = $key;
    }

    function __invoke($a, $b) {
        return strcasecmp($b[$this->key], $a[$this->key]);
    }

    public function setKey($key) {
        $this->key = $key;
    }
}

只需简单调用即可:

$compararor = new MyComparator("Name");

usort($data, $compararor);

漂亮的例子!<3 - num8er

0

试试这个:

// $a is N-th element, $b is next element and $arguments is array of arguments to use in compare logic
usort($array, function($a, $b) use ($arguments) {
     if($a>$b) return 1;
     if($a<$b) return -1;
     foreach($arguments as $argument) {
        if($a==$argument) {
           // return -1;0;1 as you wish
        }
     }
     return 0;
});

抱歉,所以使用$arguments来输入我想要比较的数组部分,例如“Name”或“Email”,然后在我使用“Name”的地方只需使用$arguments即可。 - user3596598
你的问题是将第三个或更多参数传递给排序函数。因此,在我的示例中,我使用闭包来传递它。它可以是任何东西,例如use($someArg, $anotherArg)。参考链接:http://www.php.net//manual/en/functions.anonymous.php - num8er

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接