【问题标题】:Finding duplicate values in multidimensional array在多维数组中查找重复值
【发布时间】:2016-01-24 19:40:43
【问题描述】:

我正在尝试编写一个系统,该系统将查找使用相同 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 的反复试验,这些嵌套的 foreach 将循环遍历数组,尝试使用 array_intersect 来查找重复项,但没有什么能让我接近预期的输出。到目前为止,我认为我对问题的思考过度了,解决方案真的很简单,但我似乎无法接近预期的输出。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 我建议使用 MySQL 来代替,结合使用 COUNTHAVING

标签: php multidimensional-array


【解决方案1】:
$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;
    }
}

【讨论】:

    【解决方案2】:
    $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 实现这一点可能会非常缓慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2021-06-09
      相关资源
      最近更新 更多