4

これはphpの例ですが、どの言語のアルゴリズムでもかまいません。私が特にやりたいのは、米国とカナダをリストのトップに押し上げることです。簡潔にするために短縮された配列の例を次に示します。

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

IDはそのままにしておく必要があります。したがって、それらを-1または-2にすることは、残念ながら機能しません。

4

5 に答える 5

6

このような状況で私が通常行うことは、DisplayOrderなどと呼ばれる別のフィールドを追加することです。デフォルトでは、たとえば1 ...次に、DisplayOrder、次にNameで並べ替えます。リストの上位または下位のものが必要な場合は、通常のIDをそのままにして、それに応じて表示順序を微調整できます。

-ケビンフェアチャイルド

于 2008-09-04T18:04:27.473 に答える
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 に答える
1

同様のケースでの私の近道は、カナダの先頭にスペースを 1 つ追加し、米国の先頭に 2 つのスペースを追加することです。これらを SELECT タグのオプションとして表示する場合、スペースは表示されませんが、並べ替えによって前面に表示されます。

ただし、一部のコンテキストでは、これは少しハックかもしれません。Java では、StringComparator を拡張し、compare() メソッドをオーバーライドして米国とカナダの特殊なケースを作成し、新しいコンパレータをソート アルゴリズムとして渡してリスト (または配列) をソートします。

ただし、配列内の関連するエントリを見つけて、それらを配列から削除し、最初に再度追加する方が簡単かもしれないと思います。配列を再ソートするある種のフレームワークを使用している場合、機能しない可能性があります。しかし、ほとんどの場合、それでうまくいきます。

[編集]配列ではなくハッシュを使用していることがわかります-したがって、ソートの方法によって異なります。米国をキーに -2、カナダに -1 を使用してハッシュに入れ、代わりに ID で並べ替えることができますか? PHP を 11 年間使用していないので、ハッシュに組み込みの並べ替え機能があるかどうか、またはアプリケーション レベルでそれを行っているかどうかは思い出せません。

于 2008-09-04T17:45:22.200 に答える
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 に答える