【问题标题】:Count duplicate key in array and sum them计算数组中的重复键并将它们相加
【发布时间】:2014-03-13 16:05:41
【问题描述】:

我正在尝试遍历已确定论坛主题的所有页面并获取每个用户的帖子总数,但我很难理解每次用户名在数组中重复时如何求和。

这是我的代码:

for ($x = 1; $x <= 5; $x++) {

    $ch = curl_init('http://myforum.com/thread-123?&page=' . $x);

    curl_setopt_array($ch, array(
        CURLOPT_HEADER => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE
    ));

    $response = curl_exec($ch);

    preg_match_all('/me\">[\s]+<a href=\"([^\"]+)\">([^<]+)/i', $response, $users);
    preg_match_all('/image_avatar\" src=\"([^\"]+)"/i', $response, $avatar);


    $q = count($users[1]);

    for ($i = 0; $i < $q; $i++) {
        ///////count how many times the user was inside the array///////
        //$totalPosts = ?
        ///////count how many times the user was inside the array///////

        print '-----<br /><img src="'.$avatar[1][$i].'" /><br />User: ' . $users[2][$i] . '<br />Total Posts: ' . $totalPosts . '-----<br />';        

    }


}

解决方案,谢谢@u_mulder

$all_users = array();
for ($x = 1; $x <= 5; $x++) {

    $ch = curl_init('http://myforum.com/thread-123?&page=' . $x);

    curl_setopt_array($ch, array(
        CURLOPT_HEADER => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE
    ));

    $response = curl_exec($ch);

    preg_match_all('/me\">[\s]+<a href=\"([^\"]+)\">([^<]+)/i', $response, $users);
    preg_match_all('/image_avatar\" src=\"([^\"]+)"/i', $response, $avatar);


    $all_users = array_merge($all_users, $users[2]);


}
function aprint($arr, $return = false) {
    arsort($arr);
    $wrap = '<div style=" white-space:pre; position:absolute; top:10px; left:10px; height:200px; width:100px; overflow:auto; z-index:5000;">';
    $wrap = '<pre>';
    $txt = preg_replace('/(\[.+\])\s+=>\s+Array\s+\(/msiU','$1 => Array (', print_r($arr,true));

    if ($return) return  $wrap.$txt.'</pre>';
    else echo $wrap.$txt.'</pre>';
}

$res = array_icount_values ($all_users);
$res2 = aprint($res);
print_r($res2); 

function array_icount_values($arr,$lower=true) { 
     $arr2=array(); 
     if(!is_array($arr['0'])){$arr=array($arr);} 
     foreach($arr as $k=> $v){ 
      foreach($v as $v2){ 
      if($lower==true) {$v2=strtolower($v2);} 
      if(!isset($arr2[$v2])){ 
          $arr2[$v2]=1; 
      }else{ 
           $arr2[$v2]++; 
           } 
    } 
    } 
    return $arr2; 
}

示例输出(用户名 => 帖子总数)也按帖子总数排序:

Array
(
    [user 1] => 35
    [user 2] => 11
    [user 3] => 11
    [user 4] => 8
    [user 5] => 5
    [user 6] => 4
    [user 7] => 3
    [user 8] => 2
    [user 9] => 2
    [user 10] => 2
    [user 11] => 2
    [user 12] => 1
    [user 13] => 1
    [user 14] => 1
    [user 15] => 1
    [user 16] => 1
    [user 17] => 1
    [user 18] => 1
    [user 19] => 1
    [user 20] => 1
    [user 21] => 1
    [user 22] => 1
    [user 23] => 1
    [user 24] => 1
    [user 25] => 1
    [user 26] => 1
)

【问题讨论】:

  • 这会有所帮助,如果您也请添加一些示例$responce
  • 抱歉,您必须添加更多详细信息:尚不清楚您使用了哪些数组,它们具有什么结构以及该用户名可能在哪里找到。
  • 这是否不止一页?或者它只是一个论坛线程?如果您想获得整个论坛的总数,您可能希望在数据库上有一个计数器,否则这里有一个链接可以帮助您。 stackoverflow.com/questions/13633954/…
  • 我会尝试制作一个样本。数组结构是这样的:$users = array('user found 1', 'user found 2', 'user found 3', 'user found 1', 'user found 2', 'user found 1', 'user found 1'); 你可以看到“用户找到 1”发布了 2 次以上等,我想打印用户名和发布时间之类的内容
  • @Chitowns24 我无权访问数据库。是的,它不止一页,循环转到第 1 页,将所有找到的用户名添加到数组中,然后第 2 页,同样的事情,等等。

标签: php arrays loops


【解决方案1】:

要计算数组中项目的频率,您可以使用array_count_values 函数。

您提供的数组代码作为示例:

$users = array('user found 1', 'user found 2', 'user found 3', 'user found 1', 'user found 2', 'user found 1', 'user found 1');
print_r(array_count_values($users));

结果是:

Array ( [user found 1] => 4 [user found 2] => 2 [user found 3] => 1 ) 

更新 好的,如果您有不同的页面,请尝试以下操作:

$all_users = array();
for ($x = 1; $x <= 5; $x++) {
    // ....
    preg_match_all('/me\">[\s]+<a href=\"([^\"]+)\">([^<]+)/i', $response, $users);

    $all_users = array_merge($all_users, $users[1]);
}
print_r(array_count_values($all_users));

【讨论】:

  • 但是我不知道 $users 数组的值,循环所经过的每个页面都有不同的顺序和不同的用户。 print_r(array_count_values($users); 打印 Array ( )
  • 如果你不知道$users数组的值那你要数什么?
  • pastebin.com/Fn7F6CHD,循环经过的每个页面都有相同的布局,但每次用户名不同,我想打印所有用户名以及它们在$users数组中重复的次数
  • 我发誓我在看到你的答案之前找到了一个解决方案(: 。无论如何,我做了一些与你所做的类似的事情,但我没有使用 array_merge,而是在我的 for ($i = 0; $i &lt; $q; $i++) 中使用了 array_push 并添加了一些格式化内容,在这种情况下,array_merge 对 push 有什么好处吗?好吧,我很快就会用你的解决方案和我所做的格式化内容更新我的 OP。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-27
  • 2020-10-24
  • 1970-01-01
  • 2017-03-14
  • 2015-10-25
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多