Как отсортировать по идентификатору в 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 должен быть переставлен с помощью userid.

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

Другие вопросы по тегам