排序多维数组 - 从重复数组中删除最旧的记录

时间:2017-08-04 14:37:06

标签: php multidimensional-array

<?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但我觉得我应该告诉你我在做什么,以防有人提出更好的建议?

1 个答案:

答案 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++;
    }
}

我添加了最后两个大括号,我不知道你是否错误地粘贴了,或者你是否忘记将它们放入代码中。