4

This is a php example, but an algorithm for any language would do. What I specifically want to do is bubble up the United States and Canada to the top of the list. Here is an example of the array shortened for brevity.

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

The id's need to stay intact. So making them -1 or -2 will unfortunately not work.

4

5 回答 5

6

在这些情况下,我通常会添加一个名为 DisplayOrder 或类似的单独字段。一切都默认为 1... 然后您按 DisplayOrder 和 Name 排序。如果您想要列表中更高或更低的内容,您可以相应地调整显示顺序,同时保持您的正常 ID 不变。

——凯文·费尔柴尔德

于 2008-09-04T18:04:27.473 回答
1

在类似情况下,我的捷径是在加拿大的开头添加一个空格,在美国的开头添加两个空格。如果在 SELECT 标记中将这些显示为选项,则空格不可见,但排序仍会将它们带到前面。

但是,在某些情况下,这可能有点 hacky。在 Java 中,要做的事情是扩展 StringComparator,覆盖 compare() 方法,使美国和加拿大成为特殊情况,然后对传入新比较器的列表(或数组)进行排序作为排序算法。

但是我想在数组中找到相关条目,从数组中删除它们并在开始时再次添加它们可能会更简单。如果您处于某种会重新排序数组的框架中,那么它可能无法正常工作。但在大多数情况下,这会很好。

[编辑] 我看到您使用的是哈希而不是数组 - 所以这将取决于您如何进行排序。你能简单地将美国用 -2 键放入散列,加拿大用 -1 放入散列,然后按 ID 排序吗?11 年没有愤怒地使用 PHP,我不记得它是否在其哈希中内置排序,或者您是否在应用程序级别这样做。

于 2008-09-04T17:45:22.200 回答
1
$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
于 2008-09-04T22:08:13.613 回答
0

您不能通过“移动”项目来更改同一数组中元素的顺序。您可以做什么来构建一个新数组,该数组首先包含您最喜欢的项目,然后在最后添加原始国家/地区数组中的任何其他内容:

$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);

演示

于 2011-11-13T14:24:55.767 回答
0

自从我不知道如何编码以来已经有很多年了。但是,是的。

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

array_unshift — 将一个或多个元素添加到数组的开头

于 2019-05-22T06:43:57.193 回答