PHP - 多个uasort函数会破坏排序

Adr*_*ian 4 php arrays sorting multidimensional-array

我有一个存储人的多维数组.

Array (
   id93294 => (array (
             Name => "Tom Anderson",
             Birthday => "03/17/1975"),
   id29349 => (array (
             Name => "Tom Anderson",
             Birthday => "03/17/1975")
)
Run Code Online (Sandbox Code Playgroud)

有点像那样,除了有更多的人的信息,所以我想先按生日排序然后按另一个属性排序(如果他们的家乡匹配他们的当前位置)但是一旦我在阵列上进行第二次排序它失去了第一种我确实使用过生日......

如何排序多次而不会弄乱我之前的排序.

PS我正在使用uasort.

Jon*_*Jon 6

更新

我最近在关于排序多维数组的"权威"主题中以更有能力的方式回答了这个问题.您可以安全地跳过阅读本答复的其余部分,并直接点击链接以获得更强大的解决方案.

原始答案

该功能uasort允许您定义自己的比较功能.只需将您想要的所有标准放入其中即可.

例如,按生日排序,然后按名称排序:

function comparer($first, $second) {
    // First see if birthdays differ
    if ($first['birthday'] < $second['birthday']) {
        return -1;
    }
    else if ($first['birthday'] > $second['birthday']) {
        return 1;
    }

    // OK, birthdays are equal. What else?
    if ($first['name'] < $second['name']) {
        return -1;
    }
    else if ($first['name'] > $second['name']) {
        return 1;
    }

    // No more sort criteria. The two elements are equal.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我忽略了这样一个事实,即在您的示例中,生日不是可以通过使用运算符进行简单比较来排序的格式<.在实践中,您首先将它们转换为简单的可比较格式.

更新:如果您认为保持一堆这些多标准比较器可能会很快变得难看,那么您会发现我同意.但是这个问题可以像计算机科学中的任何其他问题一样解决:只需添加另一个抽象层次.

我将在下一个示例中假设PHP 5.3,以便使用方便的anon函数语法.但原则上,你也可以这样做create_function.

function make_comparer() {
    $criteriaNames = func_get_args();
    $comparer = function($first, $second) use ($criteriaNames) {
        // Do we have anything to compare?
        while(!empty($criteriaNames)) {
            // What will we compare now?
            $criterion = array_shift($criteriaNames);

            // Do the actual comparison
            if ($first[$criterion] < $second[$criterion]) {
                return -1;
            }
            else if ($first[$criterion] > $second[$criterion]) {
                return 1;
            }

        }

        // Nothing more to compare with, so $first == $second
        return 0;
    };

    return $comparer;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

uasort($myArray, make_comparer('birthday', 'name'));
Run Code Online (Sandbox Code Playgroud)

这个例子可能试图太聪明; 一般来说,我不喜欢使用不接受名称参数的函数.但在这种情况下,使用场景是一个非常强大的论据,因为它过于聪明.