2017-10-20 2 views
-1

私はWordpressを使用しています。私はCPTに問い合わせています。ここで単一の出力例です:私の配列の複製を数えるには?

Array 
(
    [0] => WP_Post Object 
     (
      [ID] => 1400 
      [post_author] => 1 
      [post_date] => 2017-10-20 14:43:48 
      [post_date_gmt] => 2017-10-20 13:43:48 
      [post_content] => content 
      [post_title] => test-case 
      [post_excerpt] => dsfsdfsd 
      [post_status] => publish 
      [comment_status] => closed 
      [ping_status] => closed 
      [post_password] => 
      [post_name] => test-case 
      [to_ping] => 
      [pinged] => 
      [post_modified] => 2017-10-20 15:02:43 
      [post_modified_gmt] => 2017-10-20 14:02:43 
      [post_content_filtered] => 
      [post_parent] => 0 
      [guid] => http://example.com/site/?post_type=bulletin&p=1400 
      [menu_order] => 0 
      [post_type] => bulletin 
      [post_mime_type] => 
      [comment_count] => 0 
      [filter] => raw 
     ) 
) 

私は同じタイトルの重複投稿の多くを持っていますが、彼らは(それは無関係だとして、この例では、ここで表示されません)post_metaに含まれているUIDを使用

私はこのコードを使ってすべての投稿をループし、複製を見つけて複製された投稿のインスタンスを1つ含む新しい配列を作成します。

foreach ($query->posts as $post) { 

    if (!array_key_exists($post->bid, $new_array)) { 

    $new_array[$post->bid] = $post; 

    } 

} 

質問:どのように私は、さらに上記のループで各ポストの重複を数えることができますか?

+1

$ i = 0; $ i ++とelse; –

+0

@AneesSabanコード例 – ProEvilz

+0

を投稿してください。投稿が重複しているかどうかの唯一の基準は 'post_title'ですか? – apokryfos

答えて

2

あなたはちょうどあなたがこれを行うことができ、それらをカウントする必要がある場合:

$duplicateCounts = array_count_values(array_map(function ($post) { 
    return $post->post_title; 
},$query->posts); 

foreach ($query->posts as $post) { 
    if (!array_key_exists($post->bid, $new_array)) {  
     $new_array[$post->bid] = $post;  
     $new_array[$post->bid]->duplicate_count = $duplicateCounts[$post->post_title]; 
    }  
} 

何それがないことである:

  1. それだけpost_title値の配列に$query->posts結果の配列を変換します。これは、array_mapを使用して実行されます。この結果、関数の結果(この場合はpost_titleが得られます)に基づいて各配列エントリの結果が変更され、結果が新しい配列に返されます。
  2. 新しい配列内の各タイトルのインスタンスの数を数えます。これはarray_count_valuesを使用して行われます(マニュアルに従って) "配列の値をキーとして、配列の頻度を値として使用して配列を返します。"例えば。 test-caseが元の配列に12回ある場合は、周波数配列に[ "test-case" => 12 ]のようなエントリがあります。

この作業がすべて完了したら、タイトルが何回検出されたかについて周波数配列をチェックするだけです。

+0

偉大な、そのトリックでした。このコードがどのように機能するかを説明するコメントを追加して、コピー&ペーストだけでなく、これを学ぶことができますか? – ProEvilz

+0

@ProEvilzはさらに詳しい情報を追加しました。うまくいけば便利です。 – apokryfos

1

既存のコードにカウンタを入れてください。それはちょっと変わった質問のようですが、私たちはすべて「木のための森」の瞬間を持っていますので、ここに行きます:

+0

これは**すべての**重複をカウントします。**各**投稿の重複の後でした。例として、4 x Fooの投稿、4 x Barの投稿、3 x Bazの投稿(同じタイトル、別のコンテンツ)があります。私の現在のコードでは、(タイトルごとに)各投稿の1xを得ることができますが、私はいくつの複製が**それぞれが持っていた**必要がありました。 – ProEvilz

+0

これで、タイトルごとに配列を作成し、それぞれの繰り返しで配列に追加する必要があります。繰り返されるタイトルは、別のタイトルが来る前に、常に互いに直進していますか? –

関連する問題