2011-01-13 16 views
1

キーの値オカレンスに基づいて配列をソートし、一意の配列(ソート済み)を返すにはどうすればよいですか?また、それは、ソートされた新しい可能ですオカレンスに基づいて配列をソートする

$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 3, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 10, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz"); 

最終配列になるように何とかのoccuranceが含まれるようにユニークな配列をソート:以下の例を考えてみましょう

$broken_links[] = array("page_id" => 1, "reported_by" => "xyz", "reported_times" => 3); 
+0

あなたが配列値を変更する、または完全に新しい配列を生み出し、それがソートとしてカウントしないことになるであろう。 – BoltClock

答えて

0
function countErrors(array $arr) { 
    $new_arr = array(); 

    foreach ($arr as $val) { 
     if (!array_key_exists($val['page_id'], $new_arr)) { 
      $new_arr[$val['page_id']] = $val; 
      $new_arr[$val['page_id']]['reported_times'] = 1; 
     } 
     else { 
      $new_arr[$val['page_id']]['reported_times']++; 
     } 
    } 

    usort($new_arr, 'sortErrors'); 

    return $new_arr; 
} 

function sortErrors($a, $b) { 
    return $a['reported_times'] < $b['reported_times']; 
} 


$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 3, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 10, "reported_by" => "xyz"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz"); 


$fixed = countErrors($broken_links); 
+0

これは、accurences(これはおそらく必要なもの)でソートされた初期配列のレジュームを与えます。しかし、 "reported_by"の値が必ずしも同じではない場合、重要なデータは削除されます。 – regilero

+0

完全なソリューションを提供してくれてありがとう、ちょうど私が探していたもの。必要に応じて、新しい配列内のサブ配列に "reported_by"を追加できます – Kevin

1

page_idに基づいて壊れたリンクをソートするに:

私はあなたがcontaiにソートされた配列を変更する array_unique()または array_walk()のようなPHPの配列の機能の一部を使用することができます想像
function sort_broken_links($a, $b) { 
    return $a["page_id"] - $b["page_id"]; 
} 

usort($broken_links, 'sort_broken_links'); 

n reported_times。しかし、それをシンプルに保つために、私は(上記のようにソートされた)各壊れたリンクレコードの周波数を持つ配列を作成します:ソート

$freq = array(); 

foreach ($broken_links as $link) { 
    if (!isset($freq[$link["page_id"]])) { 
     $freq[$link["page_id"]] = $link; 
     $freq[$link["page_id"]]["reported_times"] = 0; 
    } 

    $freq[$link["page_id"]]["reported_times"]++; 
} 
+0

カスタムソートのための良い方法は、そのためにphpでビルドされたことを知らなかった(usort()) –

1

Adanced配列は、第二引数を使用して、特ににより、array_multisortで行うことができますアレイはです。

私はあなたが3つ目の例の場合、もう1つの要素を持っていると思います。シンプルなソートを望んでおらず、発生数でソートする必要はありません。ここで、page_idキーを含む2番目の配列を持つことができますが、occurencesでソートすると、配列全体がocurencesでソートされます。

問題は、発生時にソートされたリストbase_idを取得することです。これは、array_count_valuesで利用可能になり、続いて単純なソートが行われます。

編集:例:実際にはソートは必要ありませんが、完全なインデックスをフィードする必要があります。第二の場合には(コメント解除デバッグ付き)

$broken_links[] = array("page_id" => 1, "reported_by" => "xyz1"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz2"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz3"); 
$broken_links[] = array("page_id" => 3, "reported_by" => "xyz4"); 
$broken_links[] = array("page_id" => 55, "reported_by" => "foo"); 
$broken_links[] = array("page_id" => 1, "reported_by" => "xyz5"); 
$broken_links[] = array("page_id" => 10, "reported_by" => "xyz6"); 
$broken_links[] = array("page_id" => 2, "reported_by" => "xyz7"); 
$broken_links[] = array("page_id" => 55, "reported_by" => "foo"); 
$broken_links[] = array("page_id" => 55, "reported_by" => "foo"); 

$pages=array(); 
foreach ($broken_links as $key => $row) { 
    $pages[$key] = $row['page_id']; 
} 
//echo "page_id list:\n";print_r($pages); 
$pagesidxshort=array_count_values($pages); 
//echo "page_id occurences:\n"; print_r($pagesidxshort); 
foreach ($pages as $key => $val) { 
    $pagesidx[$key]=$pagesidxshort[ $pages[$key] ]; 
} 
//echo "page_id to sort by occurence:\n";print_r($pagesidx); 
// here broken links is sorted with same sort as $pagesidx 
array_multisort($pagesidx,SORT_DESC,$broken_links); 
//echo "Our initial array sorted by occurence of page_id:\n";//print_r($broken_links); 

出力

page_id list: 
Array 
    [0] => 1 
    [1] => 2 
    [2] => 1 
    [3] => 3 
    [4] => 55 
    [5] => 1 
    [6] => 10 
    [7] => 2 
    [8] => 55 
    [9] => 55 
page_id occurences: 
Array 
    [1] => 3 
    [2] => 2 
    [3] => 1 
    [55] => 3 
    [10] => 1 
page_id to sort by occurence: 
Array 
    [0] => 3 
    [1] => 2 
    [2] => 3 
    [3] => 1 
    [4] => 3 
    [5] => 3 
    [6] => 1 
    [7] => 2 
    [8] => 3 
    [9] => 3 
Our initial array sorted by occurence of page_id: 
Array 
    [0] => Array [page_id] => 1 [reported_by] => xyz1 
    [1] => Array [page_id] => 1 [reported_by] => xyz3 
    [2] => Array [page_id] => 1 [reported_by] => xyz5 
    [3] => Array [page_id] => 55 [reported_by] => foo 
    [4] => Array [page_id] => 55 [reported_by] => fo 
    [5] => Array [page_id] => 55 [reported_by] => foo 
    [6] => Array [page_id] => 2 [reported_by] => xyz2 
    [7] => Array [page_id] => 2 [reported_by] => xyz7 
    [8] => Array [page_id] => 3 [reported_by] => xyz4 
    [9] => Array [page_id] => 10 [reported_by] => xyz6 
関連する問題