0

URL でいっぱいの配列を取得する php 作業コードがあります。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 のリスト全体も表示しようとしています。

少なくとも私が始めるのを手伝ってくれる人はいますかksort、usortを使ってみましたが、正直なところ、その背後にあるロジックがわかりません.linklongはユーザーIDで再配置する必要があるという考えです

4

1 に答える 1

1

まず、を使用parse_urlして「クエリ」部分を抽出する必要があります。次に、を使用してparse_str、すべてのパラメーターを分離できます。

これにより、URLが有効であることを確認できます。

次に、(だけでなく)任意のフィールドで配列を並べ替えることができるようにする場合はuserId、配列の2つの要素を受け取り、それぞれ-1、0、または1を返すコールバック関数を作成する必要があります。最初の要素は2番目の要素よりも<、=、>です。

次に、配列を注文するには、関数を呼び出す必要がありますusort

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

配列を最初のパラメーターとして、コールバック関数を2番目のパラメーターとして指定します。これにより、必要な比較コールバックを作成し、必要に応じて配列を並べ替えることができます。

注:パフォーマンスに注意してください。コールバックが多くのことを行う場合、特定の並べ替えアルゴリズム(バブリング並べ替えなど)に従って、コールバック関数が配列の要素間で多くの時間呼び出されるため、並べ替えに時間がかかります。 )。

このような比較関数の例:

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 に答える