0

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

我希望能够调用排序函数并发送特定的参数来确定排序的类型。其中包括按 ( $arr['key']) 排序的字段,是字符串还是整数 ( strcmpvs x - y) 以及比较的方向 ( ascvs 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;
 }

非常感谢。

4

1 回答 1

2

下面是一个压缩 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 . '");'));
}
于 2013-04-25T02:34:04.223 回答