我正在尝试编写一个系统,该系统会查找使用相同IP的用户帐户,并使用其密钥打印匹配项。我已经编写了从MySQL中提取数据的部分,并且很好地放入了一个多维关联数组,所以输入看起来像这样(键是UserID,值是IP地址):
$users = array(
100 => array("1.1.1.1","2.2.2.2","3.3.3.3"),
200 => array("1.1.1.1","4.4.4.4","5.5.5.5"),
300 => array("1.1.1.1","4.4.4.4","7.7.7.7")
);
预期输出为:
Array
(
[1.1.1.1] => Array
(
[0] => 100
[1] => 200
[2] => 300
)
[4.4.4.4] => Array
(
[0] => 200
[1] => 300
)
)
我已经搜索并使用了多个嵌套foreach的试验和错误,它将循环遍历数组,尝试使用array_intersect来查找重复项,但没有任何东西让我接近预期的输出。到现在为止,我认为我正在过度思考问题并且解决方案非常简单,但我似乎无法接近预期的输出。感谢任何帮助,谢谢。
答案 0 :(得分:0)
$users = array(
100 => array("1.1.1.1","2.2.2.2","3.3.3.3"),
200 => array("1.1.1.1","4.4.4.4","5.5.5.5"),
300 => array("1.1.1.1","4.4.4.4","7.7.7.7")
);
$allIP = [];
foreach ( $users as $user ) {
$allIP = array_merge($allIP, $user);
}
$allIP = array_unique($allIP);
$result = [];
foreach ( $allIP as $ip ) {
foreach ( $users as $key => $val ) {
if ( in_array($ip, $val, true) ) {
if ( !isset($result[$ip]) ) {
$result[$ip] = [];
}
array_push($result[$ip], $key);
}
}
}
$result = array_filter($result, function ($v, $k) {
if ( count($v) > 1 ) {
return true;
} else {
return false;
}
}, ARRAY_FILTER_USE_BOTH);
var_dump($result);
虽然我认为通过SQL也可以做得更好。 PHP实现这一点可能会非常缓慢。
答案 1 :(得分:0)
$output = array();
// loop through each user
foreach ($users as $id => $ips) {
// loop through each IP address
foreach ($ips as $ip) {
// add IP address, if not present
if (!isset($output[$ip])) {
$output[$ip] = array();
}
// add user ID to the IP address' array
$output[$ip][] = $id;
}
}