多个foreach中的PHP unset数组

多个foreach中的PHP unset数组,php,arrays,foreach,unset,Php,Arrays,Foreach,Unset,我有一个包含ip地址及其各自子网信息的数组。在第一次,我必须将子网信息添加到我的数据库中,但我正在尝试这样做,没有任何重复,使用此代码 #Note that this is pseudo-code foreach ($subnets as $subnet) { $query = 'INSERT INTO subnets (field1, field2) VALUES ($subnet['subnet'], $subnet['netmask']);'

我有一个包含ip地址及其各自子网信息的数组。在第一次,我必须将子网信息添加到我的数据库中,但我正在尝试这样做,没有任何重复,使用此代码

#Note that this is pseudo-code
foreach ($subnets as $subnet)
{
    $query = 'INSERT INTO subnets (field1, field2) 
              VALUES ($subnet['subnet'], $subnet['netmask']);'

    $database->executeQuery($query);

    $query  = 'SELECT id FROM subnets 
               WHERE subnet = $subnet['subnet'] 
               AND mask = $subnet['netmask'];'
    $subnet_id = $database->getRow($query);

    foreach ($subnets as $key => $subnet_check)
    {
        if (($subnet['subnet'] == $subnet_check['subnet']) AND ($subnet['netmask'] == $subnet_check['netmask']))
        {
            $ip_to_add = array_merge($ip_to_add,array(array("subnet_id" => $subnet_id[0], "ip" => $subnet['ip'], "name" => $subnet['name'])));
            unset($subnets[$key]);
        }
    }
}
第一个foreach将添加每个子网并检索每个子网的id。 第二个foreach将扫描每个子网,并尝试查找重复项(包括自身)。如果是这样,它应该将ip地址信息添加到一个数组中,然后取消设置此元素,因为我们不想在另一个循环中重新插入子网

然而,这似乎并没有正确地取消设置,因为最终插入了每个子网和ip地址(插入所有子网会带来大量重复)

有人能给我解释一下为什么unset不能正常工作吗?是因为我进入了2级考试吗

谢谢。

PHP中的foreach()语句秘密复制数组并迭代该副本。这不会对性能产生任何影响,因为它使用了写时复制语义,因此只有在foreach循环中写入数组时,才会在内存中真正复制数组。你在这里做什么。因此,您的两个循环实际上是在$subnets数组的两个不同副本上迭代。当您从一个数组中取消设置时,这不会对另一个数组产生任何影响

解决这个问题的最简单方法是指示PHP不要复制。在两个循环中进行此更改:

foreach(array() as &$row) {} 

也就是说,我确实认为你的算法可以改进。 因此,你似乎在做的是:

  • 迭代每个子网
  • 插入
  • 查询插入行的ID
  • 重新迭代数组,并将一个包含ID的项添加到$ip_to_add
  • 我的问题是,你希望最后添加的$ip_看起来像什么?现在看来,如果存在重复项,那么表中只会有一个insert,但是$ip_to_add会有重复的行吗?似乎$ip_to_add将具有与原始$subnets数组相同的项数?这就是你需要的吗

    如果没有,我会做的是:

  • 对阵列进行重复数据消除
  • 迭代它,插入它,使用它获取ID,并将其添加到数组中
    你考虑过撤销这个命令吗?首先检查数据库,如果没有找到匹配项,则仅添加新记录?而不是添加,然后检查,然后删除
    foreach(array() as $key => &$row) {}