Вопрос

У меня есть массив PHP, который мне нужно отсортировать. Я включил пример массива ниже. Мне нужно поместить 10 лучших URL-адресов и их количество перспектив в другой массив. Я знаю, что могу столкнуться с проблемой, если не будет 10 лучших совпадений ... если это произойдет, тогда случайное совпадение подойдет.

Есть предложения?

Я пробовал сортировать (myarray), но он просто сортирует первый объект в массиве, он мне нужен для сортировки второго.

Есть идеи?

<Ч>
Array
(
    [0] => Array
        (
            [name] => http://bit.ly/2oUTzf
            [count] => 1
        )

    [1] => Array
        (
            [name] => http://tiny.cc/wyNbi
            [count] => 1
        )

    [2] => Array
        (
            [name] => http://ow.ly/Almo
            [count] => 1
        )

    [3] => Array
        (
            [name] => http://bit.ly/7bQ8sY
            [count] => 1
        )

    [4] => Array
        (
            [name] => http://kissa.be/w4V-
            [count] => 5
        )

    [5] => Array
        (
            [name] => http://ow.ly/xzwI
            [count] => 1
        )

    [6] => Array
        (
            [name] => http://twa.lk/L6FZX
            [count] => 1
        )

    [7] => Array
        (
            [name] => http://tinyurl.com/Alyssa10
            [count] => 1
        )

    [8] => Array
        (
            [name] => http://www.hiderefer.com/0cz7kNgA.htm
            [count] => 1
        )

    [9] => Array
        (
            [name] => http://tinyurl.com/Joanie515
            [count] => 1
        )

    [10] => Array
        (
            [name] => http://ow.ly/uJvB
            [count] => 1
        )

    [11] => Array
        (
            [name] => http://tinyurl.com/
            [count] => 1
        )

    [12] => Array
        (
            [name] => http://www.hiderefer.com/wJBUhh3G.htm
            [count] => 1
        )

    [13] => Array
        (
            [name] => http://short.to/xcxc
            [count] => 1
        )

    [14] => Array
        (
            [name] => http://bit.ly/t79FA
            [count] => 2
        )

    [15] => Array
        (
            [name] => http://tinyurl.com/yzy33yl
            [count] => 1
        )

    [16] => Array
        (
            [name] => http://p.gs/zksz6
            [count] => 1
        )

    [17] => Array
        (
            [name] => http://bit.ly/7E1cc8
            [count] => 1
        )

    [18] => Array
        (
            [name] => http://bit.ly/6hbugu
            [count] => 1
        )

    [19] => Array
        (
            [name] => http://tii.libsyn.com/index.php
            [count] => 6
        )

    [20] => Array
        (
            [name] => http://tinyurl.com/nlzzwq
            [count] => 1
        )

    [21] => Array
        (
            [name] => http://bit.ly/7gAdXi
            [count] => 1
        )

    [22] => Array
        (
            [name] => http://localtweeps.com
            [count] => 1
        )

    [23] => Array
        (
            [name] => http://localtweeps.com.
            [count] => 3
        )

    [24] => Array
        (
            [name] => http://scribd.com/doc/22365778
            [count] => 1
        )

    [25] => Array
        (
            [name] => http://quick-weight-loss-secrets.com/
            [count] => 1
        )

    [26] => Array
        (
            [name] => http://tinyurl.com/ykd5qm5
            [count] => 1
        )

    [27] => Array
        (
            [name] => http://bit.ly/5DQ6SO
            [count] => 1
        )

    [28] => Array
        (
            [name] => http://bit.ly/4z6Kww
            [count] => 1
        )

    [29] => Array
        (
            [name] => http://bit.ly/40sm9N
            [count] => 1
        )

    [30] => Array
        (
            [name] => http://bit.ly/8mh7DO
            [count] => 5
        )

    [31] => Array
        (
            [name] => http://tinyurl.com/krt5yf
            [count] => 1
        )

    [32] => Array
        (
            [name] => http://bit.ly/7GsthV
            [count] => 1
        )

    [33] => Array
        (
            [name] => http://bit.ly/1QJzvM
            [count] => 1
        )

    [34] => Array
        (
            [name] => http://yfrog.com/1durkj
            [count] => 1
        )

    [35] => Array
        (
            [name] => http://budurl.com/dxwc
            [count] => 9
        )

    [36] => Array
        (
            [name] => http://digg.com/d1qiCr
            [count] => 1
        )

    [37] => Array
        (
            [name] => http://bit.ly/eVSIo
            [count] => 1
        )

    [38] => Array
        (
            [name] => http://yfrog.com/37badgj
            [count] => 2
        )

    [39] => Array
        (
            [name] => http://tinyurl.com/qh8sos
            [count] => 1
        )

    [40] => Array
        (
            [name] => http://tinyurl.com/mz7l8d
            [count] => 3
        )

    [41] => Array
        (
            [name] => http://tinyurl.com/nratac
            [count] => 1
        )

    [42] => Array
        (
            [name] => http://tinyurl.com/yk587jx
            [count] => 1
        )

    [43] => Array
        (
            [name] => http://www.bethel.edu/alumni/homecoming/09/events/
            [count] => 1
        )

    [44] => Array
        (
            [name] => http://www.waytofit.net
            [count] => 1
        )

    [45] => Array
        (
            [name] => http://twitpic.com/rdcy8
            [count] => 1
        )

    [46] => Array
        (
            [name] => http://retwt.me/1C1Vd
            [count] => 14
        )

    [47] => Array
        (
            [name] => http://www.starbucks.com/card
            [count] => 1
        )

    [48] => Array
        (
            [name] => http://tinyurl.com/yhkbfqe
            [count] => 13
        )

    [49] => Array
        (
            [name] => http://bit.ly/playspy
            [count] => 1
        )

    [50] => Array
        (
            [name] => http://bit.ly/57rHLO
            [count] => 12
        )
Это было полезно?

Решение

Вам нужно написать собственную функцию сортировки, например:

function MyCustomSort($a, $b)
{
    if ($a->count == $b->count) {
        return 0;
    }
    return ($a->count < $b->count) ? -1 : 1;
}

Затем вы передаете эту функцию в сортировку - вот так:

usort($myArray, "MyCustomSort");

Вы также можете написать функцию, которая поможет вам сортировать по веб-сайту, например:

function MyCustomSort($a, $b)
{
    if ($a->name == $b->name) {
        return 0;
    }
    return ($a->name < $b->name) ? -1 : 1;
}

Другие советы

Вы можете использовать шаблон decorate-sort-undecorate .

<?php

$arr = Array
(
    [0] => Array
        (
            [name] => http://bit.ly/2oUTzf
            [count] => 1
        )

    [1] => Array
        (
            [name] => http://tiny.cc/wyNbi
            [count] => 1
        )

    [2] => Array
        (
            [name] => http://ow.ly/Almo
            [count] => 1
        )

    [3] => Array
        (
            [name] => http://bit.ly/7bQ8sY
            [count] => 1
        )
...
);

// actual sorting below
$arr= array_map(create_function('$a', 'return array($a["count"], $a);'), $arr); // transform into array of arrays consisted of sort key and item
sort($arr); // sort array of arrays
$arr = array_map('end', $arr); // take only last element from each array

print_r($arr);

Как это работает?

Вместо сортировки массива ваших элементов вы сортируете массив массивов, последним элементом которых является item, а first - ключ, по которому вы хотите отсортировать. После сортировки вы сохраняете только товар.

Вы можете использовать только sort для сортировки массивов массивов, поскольку PHP сравнивает два массива одинаковой длины, сравнивая его элементы один за другим.

Сортировка по нескольким полям

Вы можете использовать более одного ключа сортировки, например, сортировать по количеству, и если число идентично, учитывайте URL. Вы можете сделать это, украсив несколько ключей в порядке важности, например:

$arr = array_map(create_function('$a', 'return array($a["count"], $a["name"], $a);'), $arr); 

Почему это быстро

Этот способ может быть быстрее, чем при использовании usort , потому что он вызывает ваш пользовательский код только n раз для сортировки массива длины n. Сравнения во время сортировки выполняются с использованием встроенного компаратора, поэтому должны быть быстрыми. В методе usort пользовательский компаратор вызывается несколько раз (более n раз) во время сортировки, и это может замедлить процесс.

function sortByCount($a, $b)
{
    if ($a['count'] == $b['count']) {
        return 0;
    }
    return ($a['count'] < $b['count']) ? -1 : 1;
}

usort($myarray, "sortByCount");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top