如何在PHP中以非常特定的顺序对数组进行排序

时间:2013-04-02 22:42:45

标签: php sorting

假设我正在尝试对名为$ off的数组进行排序,看起来像这样

Array
(
    [0] => Array
        (
            [name] => alistair
            [id] => 344
        )
    [1] => Array
        (
            [name] => barney
            [id] => 333
        )
    [2] => Array
        (
            [name] => carlos
            [id] => 100
        )

我想对它进行排序,使其始终按此顺序排列:“carlos,alistair,barney”,如果名称不在排序中,则不会在数组中。我知道我必须使用usort但我不知道如何做一个cmp。我也使用子php5版本,所以我不能使用匿名函数。最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

$arr = array(
    array('name' => 'alistair', 'id' => 344),
    array('name' => 'barney', 'id' => 333),
    array('name' => 'carlos', 'id' => 100),
);

$order = array(1 => 'carlos', 'alistair', 'barney');

usort($arr, function($a, $b) use($order) {
    $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;
});

var_dump($arr);

以php4友好的方式相同:

$arr = array(
    array('name' => 'alistair', 'id' => 344),
    array('name' => 'barney', 'id' => 333),
    array('name' => 'carlos', 'id' => 100),
);

usort($arr, 'sorting_function');

function sorting_function($a, $b)
{
    $order = array(1 => 'carlos', 'alistair', 'barney');

    $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;
}

var_dump($arr);