如何从多维数组中获取多次出现?

时间:2012-02-08 17:02:54

标签: php arrays

我从我的数据库中获取记录,如此,

$q = $dbc -> prepare("SELECT id, username, loginIP FROM accounts");
$q -> execute();
while ($accounts = $q -> fetch(PDO::FETCH_ASSOC)) {
      var_dump($accounts);
}

这为我提供了所有用户名,id和用户ips,

如何检查IPS的多次出现? IP使用ip2long存储,我尝试了以下内容,

 $multiple = array_diff($accounts, array_unique($accounts));
 var_dump($multiple);

但它不起作用?

2 个答案:

答案 0 :(得分:1)

我假设,根据您查询的数据以及您提出问题的方式,您正在寻找与多个用户绑定的IP地址,因为您要么

一个。想要查看有多少真实用户绑定到单个IP
湾找出来自同一个人的重复帐户数量。

我认为这样的事情会影响你的目标。

<?php

$ip_accounts = array();

// This whole step could be done within the while loop, as shown by Josh.
foreach ($accounts as $account) {
  $ip = $account['loginIP'];
  unset($account['loginIP']);
  if (! isset($ip_accounts[$ip])) {
    $ip_accounts[$ip] = array();
  }
  $ip_accounts[$ip][] = $account;
}

function multi_accounts($ip_account) {
  return count($ip_account) > 1;
}

$many_accounts = array_filter($ip_accounts, 'multi_accounts');
print_r($many_accounts);

SAMPLE OUTPUT

[3232235821] => Array
    (
        [0] => Array
            (
                [id] => 22
                [username] => u22
            )

        [1] => Array
            (
                [id] => 33
                [username] => u33
            )

    )

[3232235830] => Array
    (
        [0] => Array
            (
                [id] => 25
                [username] => u25
            )

        [1] => Array
            (
                [id] => 31
                [username] => u31
            )

        [2] => Array
            (
                [id] => 51
                [username] => u51
            )

        [3] => Array
            (
                [id] => 91
                [username] => u91
            )

        [4] => Array
            (
                [id] => 92
                [username] => u92
            )

    )

答案 1 :(得分:1)

替代版本 - 使用SQL请求查找重复项。像这样:

$q = $dbc -> prepare("SELECT a.id, a.username, a.loginIP FROM accounts a, 
             (SELECT loginIP FROM accounts GROUP BY loginIP HAVING COUNT(*)>1) d 
              WHERE d.loginIP = a.loginIP");
$q -> execute();
$accounts = array();
while ($acc = $q -> fetch(PDO::FETCH_ASSOC)) {
      $accounts[$acc['loginIP']] = $acc;
}
var_dump($accounts);

只有重复项才会显示在$ accounts中,其中IP为数组键。