Php 使用附加参数进行排序,以确定所需的确切类型或排序

Php 使用附加参数进行排序,以确定所需的确切类型或排序,php,function,sorting,usort,Php,Function,Sorting,Usort,我有一个糟糕的排序函数,当两个函数在同一页上被调用时,它开始给我带来问题。它很可能在同一页上被多次调用 我希望能够调用排序函数并发送特定参数以确定排序类型。这些包括排序依据的字段(arr['key']),是字符串还是整数(strcmpvsx-y),以及比较方向(ascvsdesc) 我怎样才能以一种非疯狂、复杂和混乱的方式来做这件事?我尝试了大量的搜索,但是我发现了很多使用对象和类的东西,这让我很困惑,我不知道如何发送更多的参数 任何帮助,即使这是一个重复的问题,你有答案,将不胜感激 //awf

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

我希望能够调用排序函数并发送特定参数以确定排序类型。这些包括排序依据的字段(
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');
PHP5.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 . '");'));
}

您不能“发送更多参数”是什么意思?只需将您的排序代码放入一个函数中。感谢您的快速回复,这看起来是一个非常好的建议!然而,我运行的是PHP5.2,之前我忘了提到它。我敢肯定,
usort($photos,function($a,$b)使用($key,$order)
对它不起作用。有简单的替代品吗?我正在创建一个插件,不想将其限制在5.3。谢谢!我为5.2添加了一个替代品。出于某种原因,我没有得到这个评论,实际上是自己想出来的。我做的稍微不同,但完全基于您的方式,但您的方法是正确的tter和我会适应的。谢谢!@maxiscool嘿,也许你可以进一步帮助我。使用你的函数,我在我的错误日志中得到了这个错误。
[07-Jun-2013 19:19:12]PHP注意事项:使用未定义的常量photoname-假定photoname位于位置:运行时为photoname和asc创建的函数第1行
,或排序设置为的任何其他内容。该注意事项在usort create函数行触发。谢谢!它需要在参数周围加引号。“返回USORTCALLOCK($a,$b,“.”.$key.”,“.$order.”;”