сортировка массива на основе значения дочернего массива [0] (unix) - PullRequest
2 голосов
/ 29 апреля 2019

Мне нужен массив, отсортированный по Unix значениям меток времени.Я попытался использовать и ksort, и krsort, прежде чем понял, что иногда значения меток времени могут быть одинаковыми (и вы не можете иметь дублирующиеся ключи в массивах).

Вот пример массива, с которым я могу столкнуться:

$array = array(
    [
        "unix"      => 1556547761, // notice the two duplicate unix values
        "random"    => 4
    ],
    [
        "unix"      => 1556547761,
        "random"    => 2
    ],
    [
        "unix"      => 1556547769,
        "random"    => 5
    ],
    [
        "unix"      => 1556547765, // this should be in the 3rd position
        "random"    => 9
    ]
);

Итак, я пытаюсь отсортировать их все по значению unix каждого дочернего массива, однако я не могу понять, как это сделать.Я пробовал бесчисленные безумные способы (включая все другие sort функции и многие, многие for циклы), чтобы понять это - но безрезультатно.

Вся помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 29 апреля 2019

Вы можете использовать usort , который сортирует ваш массив по заданной функции

Определить функцию как:

function cmpByUnix($a, $b) {
    return $a["unix"] - $b["unix"];
}

И использовать с: usort($array, "cmpByUnix");

Пример в реальном времени: 3v4l

Обратите внимание, что вы также можете использовать asort($array);, но при этом будет также сравниваться поле "random" и сохраняться ключ - если это то, что вам нужно, тогда посмотрите на Mangeshответить

4 голосов
/ 29 апреля 2019

array_multisort () - сортировка нескольких или многомерных массивов

array_columns () - Вернуть значения из одного столбца во входном массиве

Можно использовать array_multisort() и array_column(), затем указать желаемый порядок сортировки (SORT_ASC или SORT_DESC).

array_multisort(array_column($array, "unix"), SORT_ASC, $array);

Объяснение:

В array_multisort() массивы сортируются по первому заданному массиву.Вы можете видеть, что мы используем array_column($array, "unix"), что означает, что вторым параметром является порядок сортировки (по возрастанию или убыванию), а третьим параметром является исходный массив.

Это результат array_column($array, "unix"):

Array(
    [0] => 1556547761
    [1] => 1556547761
    [2] => 1556547765
    [3] => 1556547769
)
1 голос
/ 29 апреля 2019

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

Примечание. Если два члена сравниваются как равные, их относительный порядок в отсортированном массиве не определен.

См .: https://www.php.net/manual/en/function.asort.php

<code>asort($array);

echo "<pre>";
print_r($array);
echo "
";

Это даст вам вывод в виде

Array
(
    [1] => Array
        (
            [unix] => 1556547761
            [random] => 2
        )

    [0] => Array
        (
            [unix] => 1556547761
            [random] => 4
        )

    [3] => Array
        (
            [unix] => 1556547765
            [random] => 9
        )

    [2] => Array
        (
            [unix] => 1556547769
            [random] => 5
        )

)

Вы можете оставить ключ массива [1],[0],[3],[2]) как есть Или вы можетесохраняйте его как последовательный согласно вашему требованию.

...