0

URL に重複が見つかった場合:

  1. 「スコア」を取り、元に追加します
  2. 「エンジン」文字列を取得し、元の文字列に追加します
  3. 次に、重複するエントリ全体を削除します
array
  0 => 
    array
      'url' => string 'http://blahhotel.com/'
      'score' => int 1
      'engine' => string 'cheese'
  1 => 
    array
      'url' => string 'http://www.blahdvd.com/'
      'score' => int 2
      'engine' => string 'cheese'
  2 => 
    array
      'url' => string 'http://blahhotel.com/'
      'score' => int 1
      'engine' => string 'pie'
  3 => 
    array
      'url' => string 'http://dictionary.reference.com/browse/blah'
      'score' => int 2
      'engine' => string 'pie'
  4 => 
    array
      'url' => string 'http://dictionary.reference.com/browse/blah'
      'score' => int 1
      'engine' => string 'apples'

最終的には次のようになります。

array
  0 => 
    array
      'url' => string 'http://blahhotel.com/'
      'score' => int 2
      'engine' => string 'cheese, pie'
  1 => 
    array
      'url' => string 'http://www.blahdvd.com/'
      'score' => int 2
      'engine' => string 'cheese'
  3 => 
    array
      'url' => string 'http://dictionary.reference.com/browse/blah'
      'score' => int 3
      'engine' => string 'pie, apples'
4

1 に答える 1

0

これはあなたの要件を満たしていると思います。

あなたが提供した目的の出力に基づいて、各エントリの数値インデックスを保持する必要があるように見えました。実際にこれらの数値を保持する必要がない場合は、2 番目のループと変数foreachに関する行を削除してから、単に return を返すことができます。$indices$tmpList

function reduceEntries($entries)
{
    $tmpList = array();
    $indices = array();

    foreach ($entries as $i => $entry) {
        if (isset($tmpList[$entry['url']])) {
            $tmpList[$entry['url']]['score'] += $entry['score'];
            $tmpList[$entry['url']]['engine'] .= ', ' . $entry['engine'];
        } else {
            $tmpList[$entry['url']] = $entry;
            $indices[$entry['url']] = $i;
        }
    }

    // rebuild final array with indices
    $finalList = array();
    foreach ($tmpList as $url => $entry) {
        $finalList[$indices[$url]] = $entry;
    }

    return $finalList;
}

(これはコードパッドでの実際の例です。)

于 2012-07-16T18:30:41.387 に答える