2013-02-26 3 views
0

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

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

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

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

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

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

+0

Является ли каждый идентификатор пользователя уникальным в вашем URL-адресе или у вас есть дубликаты? Если не обманывать, я бы предложил создать массив, индексированный с помощью userid, используя метод, который вам уже нужно извлечь. '$ arr [$ userid] = $ linklong;' затем просто называть 'ksort()' на нем. –

+0

Все они уникальны – user1294097

+2

parse_url(), parse_str() следует использовать не регулярное выражение – 2013-02-26 03:53:51

ответ

1

Во-первых, вы должны используйте parse_url, чтобы извлечь часть запроса. Затем, используя parse_str, вы можете отделить все параметры.

Это позволяет проверить правильность вашего URL-адреса.

Затем, если вы хотите, чтобы сортировать массив в любом поле, которое вы хотите (и не только на userId), вам просто нужно создать функцию обратного вызова, которая займет 2 элемента вашего массива и возвращает -1, 0 или 1, если первый элемент равен <, =,> чем второй.

Затем, чтобы заказать массив, вы просто должны вызвать функцию usort:

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

дающей ваш массив в качестве первого параметра и функции обратного вызова в качестве второго параметра. Это позволяет вам создать любой обратный вызов сравнения, который вы хотите, и заказать свой массив, как вы хотите.

Примечание: следите за производительностью. Если ваш обратный вызов делает много вещей, сортировка займет некоторое время, потому что функция обратного вызова называется большим количеством времени между элементами вашего массива, следуя определенному алгоритму сортировки (как пузырящийся вид).

Примером такой Comparision функции:

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