在具有特定值的数组中搜索重复项

时间:2014-08-19 12:59:43

标签: php arrays

您好我需要为写了一篇以上帖子的用户检查一个数组。我想通过user-> url做到这一点,因为这个是每个用户都有一个唯一的ID。

我的数组看起来像:

{  
   "meta":{  
      "network":"all",
      "query_type":"realtime"
   },
   "posts":[  
      {  
         "network":"facebook",
         "posted":"2014-08-16 08:31:31 +00000",
         "sentiment":"neutral",
         "url":"someURL",
         "user":{  
            "name":"Terance Podolski",
            "url":"someURL1",
            "image":"someURL"
         }
      },
      {  
         "network":"facebook",
         "posted":"2014-08-16 08:30:44 +00000",
         "sentiment":"neutral",
         "url":"someURL",
         "user":{  
            "name":"Łukasz Podolski",
            "url":"someURL2",
            "image":"someURL"
         }
      },
      {  
         "network":"facebook",
         "posted":"2014-08-16 08:25:39 +00000",
         "sentiment":"neutral",
         "url":"someURL",
         "user":{  
            "name":"Terance Podolski",
            "url":"someURL1",
            "image":"someURL"
         }
      }
]
}

首先我对阵列进行了两次排序,我只有正面和中性情绪的帖子,然后是我只有facebook发帖的网络。代码看起来像这样:

$sentimentPosNeu = array();
$sentimentPosNeuFacebook = array();

foreach ( $myarray -> posts as $post ) {
    if($post -> sentiment == 'positive' || $post -> sentiment == 'neutral')
        $sentimentPosNeu[] = $post;
}

foreach($sentimentPosNeu as $post) {
    if($post -> network == 'facebook')
        $sentimentPosNeuFacebook[] = $post;
}

现在我需要所有发布多次的用户。

我试过但不行:

$unique = array_unique($sentimentPosNeuFacebook); 
$dupes = array_diff_key( $sentimentPosNeuFacebook, $unique ); 

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,但最明显的可能是简单地添加另一个循环结构,可以按用户url对帖子进行分组。例如:

$groupedPosts = array();
foreach ($sentimentPosNeuFacebook as $post) {
   $userUrl = $post->user->url;
   if (!isset($groupedPosts[$userUrl]))
      $groupedPosts[$userUrl] = array($post);
   else
      $groupedPosts[$userUrl][] = $post;
}

这将使用用户的URL作为分组键对数组进行分组。然后,如果您想查找每个用户的帖子数量,您可以执行以下操作:

$counts = array_map(function($elem) {
   return count($elem);
}, $groupedPosts);

如果您只想计算每个用户的帖子数量,那么@girlwithglasses绝对是更好的选择。但是,如果你需要做一些更复杂的事情,希望这会让你有所作为!

答案 1 :(得分:0)

如果您只想计算每个用户在Facebook上的正面和中立帖子的数量,您可以这样做:

foreach ( $myarray -> posts as $post ) {
    if (($post -> sentiment == 'positive' || $post -> sentiment == 'neutral')
        && $post->network == 'facebook')
        $poster[$post->user->url]++;
}

如果您想自己保留帖子,而不是每次都增加一个计数,您可以让$poster[$post->user->url]成为包含该用户每个帖子的数组 - 即将$poster[$post->user->url]++替换为{ {1}}在上面的代码中,使用$poster[$post->user->url][] = $post来获取帖子数量。