Search code examples
phpsortingnumeric

Sort array based on numeric value on second line of each element


I write an array like this:

$tags = [
    "Channel1\n" . 26210,
    "Channel2\n" . 7896 . "\n---------------",
    "Channel3\n" . 5035 . "\n---------------",
    "Channel4\n" . 25794 . "\n---------------",
    "Channel5\n" . 91143 . "\n---------------",
    "Channel6\n" . 42075 . "\n---------------",
    "Channel7\n" . 11815 . "\n---------------",
    "Channel8\n" . 180 . "\n---------------",
    "Channel9\n" . 171 . "\n---------------",
    "Channel10\n" . 82106  . "\n---------------"
];

Now I use sort() function to sort this array, But I need it sorted only by those integers that display between two strings (specific part of an array). For example: Channel9 - 171 , Channel8 - 180 ...


Solution

  • I would probably get the numbers in an array and sort on that:

    $nums = preg_filter('/[^\n][^\d]+/', '', $tags); //or preg_replace()
    array_multisort($nums, $tags);
    

    A slightly longer approach:

    usort($tags, function($a, $b) {
                     $a = explode("\n", $a)[1];
                     $b = explode("\n", $b)[1];
                     if ($a == $b) { return 0; }
                     return ($a < $b) ? -1 : 1;
                 });