Как сортировать по идентификатору в URL-адресе с помощью php и preg_match

У меня есть рабочий код php, в котором я беру массив, полный URL-адресов, я использую preg_match для получения всей информации в URL-адресе, например, типичный URL-адрес выглядит так:

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

Чтобы соответствовать идентификатору пользователя, я использую это в цикле foreach:

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

Основной массив отсортирован в алфавитном порядке с более чем 600 URL-адресами, и он отлично отображается, но я также пытаюсь отобразить весь список URL-адресов, отсортированных по идентификатору пользователя.

Может ли кто-нибудь помочь хотя бы начать? Я пытался использовать ksort, usort, но, честно говоря, не понимаю логики, стоящей за этим. Идея состоит в том, что linklong нужно будет переставить по идентификатору пользователя.


person user1294097    schedule 26.02.2013    source источник
comment
Каждый ли идентификатор пользователя уникален в вашем наборе URL-адресов или у вас есть дубликаты? Если нет дубликатов, я бы предложил создать массив, индексированный по идентификатору пользователя, используя метод, который у вас уже есть для его извлечения. $arr[$userid] = $linklong;, а затем просто звоню ksort() на него.   -  person Michael Berkowski    schedule 26.02.2013
comment
parse_url(), parse_str() следует использовать не регулярное выражение   -  person    schedule 26.02.2013


Ответы (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-адрес действителен, и в конечном итоге выдать исключение, если это не так.

person MatRt    schedule 26.02.2013