Сортировка числовых значений массива без повторной индексации (PHP) - PullRequest
2 голосов
/ 23 декабря 2009

Что я делаю, это:

  • Я получаю список значений ID (числовых) из БД и сохраняю его в массив (1, 2, 2, ...)
  • Затем я считаю количество дубликатов array_count_values. это выводит ([1] => 1, [2] => 2, ...)
  • Затем я хочу изменить порядок массива в порядке убывания с помощью счетчика
  • Затем я просто использую array_keys($array), чтобы получить идентификаторы в упорядоченном списке.

Однажды я использовал array_multisort для аналогичной функции, но в этом случае клавиши были строками ('a' => 2). Теперь проблема в том, что я использую числовые ключи, и мультисортировка переиндексирует ключи к 1, 2, 3, потому что ключи, содержащие значение счетчика, являются числовыми идентификаторами. Это, конечно, лишает смысла цель, потому что я больше ничего не могу определить ..

Во всяком случае, вот что я примерно делаю сейчас:

$array = array(3, 1, 2, 3, 2, 3);
// count the IDs [0]=>3, [1]=>1, [2]=>2

$count = array_count_values($array);

// sort and screw up the id's: [0]=>3 [1]=>1 [2]=>2
array_multisort($count);

Что-то говорит мне, что есть лучший способ приблизиться к этому?

Ответы [ 5 ]

7 голосов
/ 23 декабря 2009

Попробуйте asort вместо array_multisort, поскольку оно поддерживает исходную связь индекса.

2 голосов
/ 23 декабря 2009

Угадывая из вашего первого предложения:

Я получаю список значений ID (числовых) из БД и сохраняю его в массив (1, 2, 2, ...)

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

SELECT id, COUNT(id) AS quantity FROM table GROUP BY id ORDER BY quantity DESC
1 голос
/ 23 декабря 2009

Зачем вам это нужно с php? Измените оператор SQL, чтобы получить правильные результаты. что-то вроде

select ID, count(another_col) as occurrence
from table
group by ID
sort by occurrence

Правильный синтаксис SQL см. http://www.techonthenet.com/sql/group_by.php

edit: ups пропустили критерии сортировки. Должно быть по случаю, а не по идентификатору

0 голосов
/ 12 августа 2016

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

// Let's say your data is a hash lookup where the key is important.
$user_ids = array_keys($users);
// You want to sort by username so copy those values.
$usernames = array_column($users, 'username');
// Now sort your arrays.
array_multisort($usernames, SORT_ASC, $user_ids, $users);
// Simply recombine your keys and values.
$users = array_combine($user_ids, $users);
0 голосов
/ 23 декабря 2009

Как уже упоминалось, если вы можете получить данные, отсортированные из базы данных, это может быть лучше. Если вы хотите сделать это на PHP и вам нужен обратный порядок, используйте [arsort][1].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...