4

要するに、各メンバーが出現する回数で配列を並べ替えてから、重複を削除したいと思います。

したがって、この:

$array = array('s', 'h', 'c', 'b', 'a', 'b', 'd', 'e', 'f', 'f', 'g')

最初に注文します:

('b', 'b', 'f', 'f', 's', 'h', 'c', 'a', 'd', 'e', 'g')

そして、重複を削除します:

$array = array_unique($array);

そして、次のようになります。

('b', 'f', 's', 'h', 'c', 'a', 'd', 'e', 'g')

それで、どうすればいいですか?前もって感謝します。

4

5 に答える 5

3

これを行う簡単な方法は、元の配列内の各文字/エントリの各インスタンスをカウントし、カウントされたものを並べ替え、並べ替えられたリストから一意の値を (順番に) 取得する配列/マップを構築することです。

実装例は次のとおりです。

<?php
$unsorted = array('a', 'b', 'c', 'b', 'd', 'e', 'f', 'f', 'g');

// build an array that "counts" each instance/entry
$count = array();
foreach ($unsorted as $key) {
    if (!isset($count[$key])) $count[$key] = 0;
    $count[$key]++;
}
// sort the counted array in reverse order (to be "descending")
arsort($count, SORT_NUMERIC);

// copy each of the keys of `$count`, in-order, into a new array
$sorted = array();
foreach ($count as $key=>$count) $sorted[] = $key;

print_r($sorted);
?>

これにより、次の出力が得られます。

Array( [0] => f [1] => b [2] => e [3] => g [4] => d [5] => c [6] => a )

これは、最初に見た文字の順序を保持しません。実際には、元の配列にある回数に基づいて並べ替えます。インスタンスで並べ替えた後にアルファベット順に並べ替えるなど、他の並べ替え機能を追加する追加のロジックで変更できます。

編集:array_count_values()のように使用される関数は、$count = array_count_values($unsorted)上記の「カウント」ループ全体を置き換えることができます。その関数からの出力は、私のループによって生成されるものとまったく同じです。そのヒントをくれた@Anaに感謝します!

于 2012-07-17T18:07:59.113 に答える
3

受け入れられた答えは理想的ではなく、キーと値のペアが保持されないか、OP が投稿した出力が得られないため、実際には正しくありません。これを行う簡単な方法は次のとおりです。

function sortAndUnique($array)
{
  arsort($array);
  $array = array_count_values($array);
  arsort($array, SORT_NUMERIC);
  return $array;
}

これは、最初に配列をアルファベット順に並べ替え、次に最も頻繁に発生する値で並べ替え、次にそれらの値を数値順に並べ替えます。

于 2012-07-17T18:14:36.383 に答える
1

array_count_valuesを使用してみてから、返された配列を ( asortを使用して) 並べ替えてから、キーを別の配列に抽出することができます。

于 2012-07-17T18:07:48.580 に答える
1

最初に単語数を数えてから、アイテム数に基づいて配列を再構築することをお勧めします。

編集: 次の初歩的なスニペットが役立つ場合があります。それはあなたが望むことをしますが、最終ループが些細なケース以外で行うのと同じくらい多くの配列を非効率的に作成する使用については疑問があります。

$array = array('cat', 'dog', 'fish', 'fish');
$counts = array();
foreach ($array as $v)
{
    $counts[$v]++;
}
arsort($counts);
$array = array();
foreach ($counts as $k => $v)
{
    // $array = array_merge($array, array_fill(0, $v, $k));
    // ok, remove duplicates
    $array[] = $v;
}
print_r($array);

編集 2: うわー、その他の答えと私のものはよく似ています! 私は遅くする必要があると思います

于 2012-07-17T17:56:58.623 に答える
0

一意の値を削除する前に、同じようにusort関数を使用してください。

于 2012-07-17T18:01:23.633 に答える