使用额外的参数进行排序,以确定所需的确切类型或排序


usort with extra parameters to determine the exact type or sort needed

我有这个糟糕的排序函数,当在同一页面上调用两个排序函数时,它开始给我带来问题。它很可能会在同一个页面上被调用多次。

我希望能够调用排序函数并发送特定参数来确定排序的类型。这些包括由($arr['key'])排序的字段,无论是字符串还是整数(strcmp vs x - y),以及比较(asc vs desc)的方向。

我怎样才能以一种不疯狂、不复杂、不混乱的方式做到这一点?我尝试了很多很多的搜索,但我发现很多东西都使用对象和类,这让我很困惑,我不知道如何发送更多的参数。

任何帮助,即使这是一个重复的问题,你有答案,将非常非常感激!

//awful sorting function
switch($sort) {
case 'photoname_asc':
    function a_compare($a, $b) {
        $t1 = $a['photoname'];
        $t2 = $b['photoname'];
        return strcmp($t1, $t2);
    }
    usort($photos, 'a_compare');
    default;
    break;
case 'photoname_desc':
    function a_compare($a, $b) {
        $t1 = $a['photoname'];
        $t2 = $b['photoname'];
        return strcmp($t2, $t1);
    }
    usort($photos, 'a_compare');
    break;
case 'dateup_asc':
    function a_compare($a, $b) {
        $t1 = $a['id'];
        $t2 = $b['id'];
        return $t1 - $t2;
    }
    usort($photos, 'a_compare');
    break;
case 'dateup_desc':
    function a_compare($a, $b) {
        $t1 = $a['id'];
        $t2 = $b['id'];
        return $t2 - $t1;
    }
    usort($photos, 'a_compare');
    break;
 }

下面是一个压缩switch语句的函数示例。警告,未经测试,但应该可以做到。

function photoStort(array &$photos, $key, $order) {
    if ($order !== 'desc' && $order !== 'asc') {
        return false;
    }
    usort($photos, function($a, $b) use ($key, $order) {
        $t1 = $a[$key];
        $t2 = $b[$key];
        if (is_string($t1) && is_string($t2)) {
            if ($order === 'asc') {
                return strcmp($t1, $t2);
            } else {
                return strcmp($t2, $t1);
            }
        } elseif (is_int($t1) && is_int($t2)) {
            if ($order === 'asc') {
                return $t1 - $t2;
            } else {
                return $t2 - $t1;
            }
        } else {
            trigger_error('Invalid type in photoSort!', E_WARNING);
        }
    });
}
$photos = array(/* Photos */);
//ex 1
photoSort($photos, 'photoname', 'asc');
//ex 2
photoSort($photos, 'id', 'desc');

PHP 5.2解决方案

function usortCallback($a, $b, $key, $order) {
    $t1 = $a[$key];
    $t2 = $b[$key];
    if (is_string($t1) && is_string($t2)) {
        if ($order === 'asc') {
            return strcmp($t1, $t2);
        } else {
            return strcmp($t2, $t1);
        }
    } elseif (is_int($t1) && is_int($t2)) {
        if ($order === 'asc') {
            return $t1 - $t2;
        } else {
            return $t2 - $t1;
        }
    } else {
        trigger_error('Invalid type in photoSort!', E_WARNING);
    }
}
function photoSort(array &$photos, $key, $order) {
    if ($order !== 'desc' && $order !== 'asc') {
        return false;
    }
    usort($photos, create_function('$a, $b', 'return usortCallback($a, $b, "' . $key . '", "' . $order . '");'));
}