Как получить множественные вхождения из многомерного массива?

Я получаю записи из своей базы данных так,

$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); 

Но это не сработало?

Альтернативная версия – используйте 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-адресами в виде ключей массива.

Я полагаю, исходя из данных, которые вы запрашиваете, и того, как вы заявляете вопрос, что вы ищете 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); с <?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); 

ВЫХОД ОБРАЗЦА

 [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 ) )