2017-10-20 13 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

我使用此代码循环遍历所有帖子,找到重复项并创建一个包含重复帖子的单个实例的新数组。

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

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

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

    } 

} 

问题:我怎么能还与上面的循环计数每个岗位的重复?

+1

$ i = 0;和另一个$ i ++;? –

+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. 它改造$query->posts结果数组只post_title值的数组。这是通过使用array_map来完成的,它会根据函数的结果改变每个数组项的结果(在这种情况下得到post_title),并将结果返回到一个新数组中。
  2. 计算新数组中每个标题的实例数量,这是通过使用array_count_values来完成的,它将根据手册“使用数组的值作为键返回数组作为值返回数组”。例如。如果您在原始阵列中有test-case 12次,它将在频率阵列中有一个条目,如[ "test-case" => 12 ]

一旦完成了这一切,只需要检查频率数组的标题找到次数。

+0

太棒了,那个伎俩。请你能解释一下这段代码是如何工作的,以便我可以学习这些,而不仅仅是复制和粘贴? – ProEvilz

+0

@ProEvilz增加了更多信息。希望它有用。 – apokryfos

1

你只需要在你现有的代码中添加一个计数器。这似乎有点奇怪的问题,但我们都有那些“树木树木”的时刻,所以你在这里:

$duplicates = 0; 
foreach ($query->posts as $post) { 

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

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

    } 
    else { 
     $duplicates++; 
    } 

} 
+0

这将计算**所有**重复项,我是在每个**项后重复**。所以要清楚,例如,会有'4 x Foo'帖子,4 x Bar'帖子'3 x Baz'帖子(相同标题,不同内容)。用我现在的代码,我可以得到每个帖子的1个(按标题),但是我需要每个**有多少个重复**。 – ProEvilz

+0

好吧,那么你需要为每个标题创建一个数组,并添加每个重复的数组。在另一个标题出现之前,重复的标题是否总是彼此相邻? –