如何使用php和preg_match按URL在ID中排序

时间:2013-02-26 03:48:10

标签: php preg-match usort ksort

我有一个php工作代码,我在其中获取一个充满URL的数组,我使用preg_match来获取URL中的所有信息,例如典型的URL如下所示:

http://photos.com/path=images&user=Ron197&userid=970965&hue=soft

为了匹配用户ID我在foreach循环中使用它:

preg_match_all('/userid=(.+?)&hue/', $linklong, $userid);
        $userid = $userid[1][0];
        //print_r($userid);

主数组按字母顺序排序,有超过600个网址,它显示就好了,但我还试图显示按用户标识排序的整个网址列表。

任何人都可以帮助至少让我开始我尝试使用kso​​rt,usort,但老实说,我没有得到它背后的逻辑想法是linklong需要由userid重新排列

1 个答案:

答案 0 :(得分:1)

首先,您应该使用parse_url来提取您的“查询”。部分。然后,使用parse_str,您可以分隔所有参数。

这样可以检查您的网址是否有效。

然后,如果你想能够在你想要的任何字段(而不仅仅是userId)上对数组进行排序,你只需创建一个回调函数,它将获取数组的2个元素并返回如果第一元素是<,=,则>,则分别为-1,0或1。而不是第二个。

然后,要订购数组,只需调用函数usort

bool usort ( array &$array , callable $cmp_function )

将数组作为第一个参数,将回调函数作为第二个参数。 这允许您创建所需的任何比较回调,并按您的意愿订购数组。

注意:注意性能..如果你的回调做了很多事情,排序将花费一些时间,因为回调函数在数组的元素之间被调用了很多时间,遵循特定的排序算法(如冒泡的那种。)

这种比较函数的一个例子:

function compareUrlCustom($u1, $2)
{
    // Parse the 2 URLs
    $urlParts1 = parse_url($u1);
    $urlParts2 = parse_url($u2);

    // Extract and parse the 2 query parts
    $queryParts1 = array();
    $queryParts2 = array();
    parse_str($urlParts1['query'], $queryParts1);
    parse_str($urlParts2['query'], $queryParts2);

    // Return 1, O or -1 as comparision value
    if ($queryParts1['userId'] > $queryParts2['userId'])
        return 1;
    else if ($queryParts2['userId'] > $queryParts1['userId'])
        return -1;
    else
        return 0;
}

然后,您可以使用以下命令调用数组:

$wellSorted = usort($yourArray, compareUrlCustom);

并检查$wellSorted以了解排序操作是否成功。

注意:您应该在compareUrlCustom函数中添加一些检查以确保具有有效的URL,如果不是这样,最终会抛出异常。