2008-09-04 9 views
3

这是一个php的例子,但任何语言的算法都可以。我特别想要做的是将美国和加拿大吹到榜单的顶端。下面是为简洁起见缩短阵列的一个例子。鉴于我有一个按字母顺序排序的id(键)和国家(值)的哈希值,什么是最好的方式来泡进一个条目到栈顶?

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

该id需要保持不变。所以使他们-1或-2将不幸工作。

回答

1

我在类似情况下的捷径是在加拿大开始时增加一个空格,在美国开始时增加两个空格。如果将这些选项显示为SELECT标签中的选项,则空间不可见,但排序仍将它们置于前面。

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

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

我看到你正在使用散列而不是数组 - 所以它将取决于你如何进行排序。你可以简单地把美国加入到-2的加密中,加1加1,然后按ID排序?没有在愤怒中使用过11年的PHP,我不记得它是否有内置的哈希分类,或者你是否在应用程序级别进行分类。

6

我通常在这些情况下做的是添加一个名为DisplayOrder或类似的独立字段。一切都默认为1,然后按DisplayOrder排序,然后按名称排序。如果您想要列表中的项目更高或更低,则可以相应地调整显示顺序,同时保持正常的ID。

- 凯文仙童

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

Demo

相关问题