<?php
$q = "SELECT `Code` FROM `productspecs` GROUP BY `Code` HAVING COUNT(1) > 1";
$r = mysqli_query($conn, $q);
$a = 0;
while ($row = mysqli_fetch_array($r))
{
echo $row['Code'];
$q2 = "SELECT * FROM `productspecs` WHERE `Code`='" . $row['Code'] . "'";
$r2 = mysqli_query($conn, $q2);
$i = 0;
while ($row2 = mysqli_fetch_array($r2))
{
$Mod = $row2['ModificationDate'];
$ModDates[] = DateTime::createFromFormat('d/m/Y', $Mod); // === $ModDates[$i]
$ModDates[$i]['SpecID']=$row2['SpecID'];
$i++;
}
usort($ModDates); // <<< ??
$DeleteIDs[] = $ModDates[0]['SpecID'];
foreach ($ModDates as $ModDate)
{
echo $ModDate->format('d-m-Y');}
unset($ModDates); // unset the array for the next code
echo '</br>';
echo 'Delete: ' . $DeleteIDs[$a];
$a++;
}
?>
您好我正在尝试从产品数据库中删除规范(或至少获取要删除的规范列表)我们有重复项,我们想要删除最旧的规范。
所以我在这里1)找到了重复代码列表2)为每个mod日期分配了spec id 3)对mod日期进行了排序以找到最旧的* NOTE 4)找到要删除的id列表,找到id分配给排序数组的第一个。 5)为下一组重复项取消设置moddate数组
注意:我认为解决这个问题可能与排序多维数组有关 - 这是我相当肯定是错误的部分。如果这不是一个多维数组,我们至少会按顺序查看修改日期。在这一点上,我可以只搜索产品代码和最早的(在阵列中的第一个)模具日期,现在考虑它 - 会得到相同的结果吗?主键是否会丢失是否重要 - 毕竟 - 我需要的是用旧的修改日期去除产品代码..我们没有主键没关系吗?
P.S。我确实看到一篇关于排序多维数组的帖子Here但我觉得我应该告诉你我在做什么,以防有人提出更好的建议?
答案 0 :(得分:0)
<?php
$q = "SELECT `Code` FROM `productspecs` GROUP BY `Code` HAVING COUNT(1) > 1";
$r = mysqli_query($conn, $q);
$a = 0;
那个$a
变量似乎毫无用处。
while ($row = mysqli_fetch_array($r)) {
echo $row['Code'];
$q2 = "SELECT * FROM `productspecs` WHERE `Code`='" . $row['Code'] . "'";
$r2 = mysqli_query($conn, $q2);
$i = 0;
while ($row2 = mysqli_fetch_array($r2)) {
$Mod = $row2['ModificationDate'];
$ModDates[] = DateTime::createFromFormat('d/m/Y', $Mod); // === $ModDates[$i]
$ModDates[$i]['SpecID'] = $row2['SpecID'];
$i++;
如果你说$ModDates[] === $ModDates[$i]
,请在两项作业中写下$ModDates[$i]
。 $ ModDates [] === $ ModDates [$ i] can be wrong, $ModDates[$i] === $ModDates[$i]
不能。
而且:
$ModDates[] = ...
$ModDates[$i]['SpecID'] = $row2['SpecID'];
现在,第一行中分配给$ ModDates [$ i]的任何内容都消失了,它现在只是一个只有一个键的数组:'SpecId'
。
}
usort($ModDates); // <<< ??
该评论意味着什么?
$DeleteIDs[] = $ModDates[0]['SpecID'];
您只将数组中的一个值放入$DeleteIDs
。为什么?
foreach ($ModDates as $ModDate) {
echo $ModDate->format('d-m-Y');}
unset($ModDates); // unset the array for the next code
那个foreach只会迭代一次,因为右上方的行会取消它迭代的数组。
如果它是一个错误,你实际上想要取消设置$ModDate
:
- 这将教你使用可以区分名称的变量
- 无论如何也不会想要,因为$ModDate
是$ModDates
条目的副本,而不是条目本身。取消它会在$ModDates
中改变任何内容。
echo '</br>';
echo 'Delete: ' . $DeleteIDs[$a];
$a++;
}
}
我添加了最后两个大括号,我不知道你是否错误地粘贴了,或者你是否忘记将它们放入代码中。