Как отсортировать массив по значению ключа и сохранить порядок равным - PullRequest
2 голосов
/ 04 июня 2019

Как отсортировать массив по значению ключа и сохранить порядок, если значение равно.

Массив:

Array ( [0] => Array ( [id] => 65 [count] => 2 ) [1] => Array ( [id] => 67 [count] => 500 ) [2] => Array ( [id] => 61 [count] => 225 ) [3] => Array ( [id] => 58 [count] => 2 ) )

Желаемый выход:

Array ( [0] => Array ( [id] => 67 [count] => 500 ) [1] => Array ( [id] => 61 [count] => 225 ) [2] => Array ( [id] => 65 [count] => 2 ) [3] => Array ( [id] => 58 [count] => 2 ) )

Я хочу отсортировать по ключу 'count' по убыванию.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Вы можете использовать usort и возвращать 0, если значения одинаковы для сохранения порядка:

$arrays = [
    ["id" => -10,"count" => 2],
    ["id" => 10000,"count" => 2],
    ["id" => 1000,"count" => -1],
    ["id" => 1000,"count" => 2],
    ["id" => 65,"count" => 2],
    ["id" => 67,"count" => 500],
    ["id" => 61,"count" => 225],
    ["id" => 58,"count" => 2],
    ["id" => 59,"count" => 2]
];

usort($arrays, function ($x, $y) {
    if ($x['count'] === $y['count']) {
        return 0;
    } elseif ($x['count'] > $y['count']) {
        return -1;
    } else {
        return 1;
    }
});

print_r($arrays);

Результат

Array
(
    [0] => Array
        (
            [id] => 67
            [count] => 500
        )

    [1] => Array
        (
            [id] => 61
            [count] => 225
        )

    [2] => Array
        (
            [id] => -10
            [count] => 2
        )

    [3] => Array
        (
            [id] => 10000
            [count] => 2
        )

    [4] => Array
        (
            [id] => 1000
            [count] => 2
        )

    [5] => Array
        (
            [id] => 65
            [count] => 2
        )

    [6] => Array
        (
            [id] => 58
            [count] => 2
        )

    [7] => Array
        (
            [id] => 59
            [count] => 2
        )

    [8] => Array
        (
            [id] => 1000
            [count] => -1
        )

)

См. php демо

0 голосов
/ 04 июня 2019

Я предполагаю, что мы хотим дважды отсортировать наш массив на основе наших двух ключей. Затем мы определяем наш массив как $arr и array_multisort для желаемых ключей:

array_multisort(array_column($arr, 'count'), SORT_DESC, array_column($arr, 'id'), SORT_DESC, $arr); 

Если мы сортируем только по count, мы удалили бы id:

array_multisort(array_column($arr, 'count'), SORT_DESC, $arr);

Тест 1

$arr = [
    "0" =>
    [
        "id" => 65, "count" => 2,
    ],
    "1" =>
    [
        "id" => 67, "count" => 500,
    ],
    "2" =>
    [
        "id" => 61, "count" => 225,
    ],
    "3" =>
    [
        "id" => 58, "count" => 2,
    ],
];

array_multisort(array_column($arr, 'count'), SORT_DESC, array_column($arr, 'id'), SORT_DESC, $arr);

var_dump($arr);

Выход 1

array(4) {
  [0]=>
  array(2) {
    ["id"]=>
    int(67)
    ["count"]=>
    int(500)
  }
  [1]=>
  array(2) {
    ["id"]=>
    int(61)
    ["count"]=>
    int(225)
  }
  [2]=>
  array(2) {
    ["id"]=>
    int(65)
    ["count"]=>
    int(2)
  }
  [3]=>
  array(2) {
    ["id"]=>
    int(58)
    ["count"]=>
    int(2)
  }
}

Если мы хотим отсортировать только по count, это, вероятно, сработает:

Тест 1

$arr = [
    "0" =>
    [
        "id" => 65, "count" => 2,
    ],
    "1" =>
    [
        "id" => 67, "count" => 500,
    ],
    "2" =>
    [
        "id" => 61, "count" => 225,
    ],
    "3" =>
    [
        "id" => 58, "count" => 2,
    ],
];

array_multisort(array_column($arr, 'count'), SORT_DESC, $arr);

var_dump($arr);

Выход 2

  array(4) {
    [0]=>
    array(2) {
      ["id"]=>
      int(67)
      ["count"]=>
      int(500)
    }
    [1]=>
    array(2) {
      ["id"]=>
      int(61)
      ["count"]=>
      int(225)
    }
    [2]=>
    array(2) {
      ["id"]=>
      int(58)
      ["count"]=>
      int(2)
    }
    [3]=>
    array(2) {
      ["id"]=>
      int(65)
      ["count"]=>
      int(2)
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...