0

我有一个 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 多个 url,它显示得很好,但我也试图显示按用户 ID 排序的整个 URL 列表。

任何人都可以帮助我至少开始我尝试使用kso​​rt,usort,但老实说我不明白它背后的逻辑想法是linklong需要通过userid重新排列

4

1 回答 1

1

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

这允许您检查您的 URL 是否有效。

然后,如果您希望能够在所需的任何字段上对数组进行排序(而不仅仅是在 上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,如果不是这种情况,最终会引发异常。

于 2013-02-26T03:59:20.970 回答