多个foreach中的PHP unset数组
我有一个包含ip地址及其各自子网信息的数组。在第一次,我必须将子网信息添加到我的数据库中,但我正在尝试这样做,没有任何重复,使用此代码多个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']);'
#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) {}
或
也就是说,我确实认为你的算法可以改进。
因此,你似乎在做的是:
你考虑过撤销这个命令吗?首先检查数据库,如果没有找到匹配项,则仅添加新记录?而不是添加,然后检查,然后删除
foreach(array() as $key => &$row) {}