Учитывая, что у меня есть хэш id (ключ) и страны (значения), отсортированные в алфавитном порядке, каков наилучший способ создать запись в верхней части стека? - PullRequest
3 голосов
/ 04 сентября 2008

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

array(
  0 => '-- SELECT --',
  1 => 'Afghanistan',
  2 => 'Albania',
  3 => 'Algeria',
  4 => 'American Samoa',
  5 => 'Andorra',)

Идентификатор должен остаться без изменений. Так что, делая их -1 или -2, к сожалению, не сработает.

Ответы [ 5 ]

6 голосов
/ 04 сентября 2008

В этих ситуациях я обычно добавляю отдельное поле с именем DisplayOrder или что-то подобное. Все по умолчанию, скажем, 1 ... Затем вы сортируете по DisplayOrder, а затем по имени. Если вы хотите, чтобы в списке было что-то выше или ниже, вы можете соответствующим образом изменить порядок отображения, сохраняя ваши обычные идентификаторы как есть.

- Кевин Фэйрчайлд

1 голос
/ 05 сентября 2008
$a = array(
    0 => '- select -',
    1 => 'Afghanistan',
    2 => 'Albania',
    3 => 'Algeria',
    80 => 'USA'
);

$temp = array();
foreach ($a as $k => $v) {
    $v == 'USA'
        ? array_unshift($temp, array($k, $v))
        : array_push($temp, array($k, $v));
}
foreach ($temp as $t) {
    list ($k, $v) = $t;
    echo "$k => $v\n";
}

Выходные данные тогда:

80 => USA
0 => - select -
1 => Afghanistan
2 => Albania
3 => Algeria
1 голос
/ 04 сентября 2008

Мой ярлык в подобных случаях - добавить пробел в начале Канады и два пробела в начале Соединенных Штатов. Если они отображаются как опции в теге SELECT, пробелы не отображаются, но сортировка по-прежнему переносит их на передний план.

Однако в некоторых контекстах это может быть немного хакерским. В Java нужно было бы расширить StringComparator, переопределить метод compare (), создав особые случаи в США и Канаде, а затем отсортировать список (или массив), передавая новый компаратор, в качестве алгоритма сортировки.

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

[править] Я вижу, что вы используете хеш, а не массив - поэтому это будет зависеть от того, как вы выполняете сортировку. Не могли бы вы просто поместить США в хеш с ключом -2, Канаду с -1, а затем вместо этого отсортировать по ID? Не использовав PHP в гневе в течение 11 лет, я не могу вспомнить, имеет ли он встроенную сортировку в своих хешах или вы делаете это на уровне приложения.

0 голосов
/ 22 мая 2019

Прошло много лет, так как я не знаю, как кодировать. Но да.

array_unshift($queue, "United States", "Canada");
print_r($queue);

array_unshift - добавить один или несколько элементов к началу массива

0 голосов
/ 13 ноября 2011

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

$countries = array(
  0 => '-- SELECT --',
  1 => 'Afghanistan',
  2 => 'Albania',
  3 => 'Algeria',
  4 => 'American Samoa',
  5 => 'Andorra',
  22 => 'Canada',
  44 => 'United States',);

# tell what should be upfront (by id)
$favourites = array(0, 44, 22);

# add favourites at first
$ordered = array();
foreach($favourites as $id)
{
    $ordered[$id] = $countries[$id];
}

# add everything else
$ordered += array_diff_assoc($countries, $ordered);

# result
print_r($ordered);

Демо

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