Php 嵌套foreach循环的帮助

Php 嵌套foreach循环的帮助,php,Php,我试图最终在一个不再使用的目录中找到文件并删除它们。我使用数据库中的一个字段来匹配文件名;它们是一样的 外部循环用于数据库值,内部循环用于目录中的文件。我在内部循环中使用if-stmt,但是我得到的文件显示在输出中,而不应该出现在那里。我做错了什么 如果我的目录中有一个文件,但没有匹配的数据库值,我想删除该文件 foreach( $ds as $id ){ foreach( $out as $file ){

我试图最终在一个不再使用的目录中找到文件并删除它们。我使用数据库中的一个字段来匹配文件名;它们是一样的

外部循环用于数据库值,内部循环用于目录中的文件。我在内部循环中使用if-stmt,但是我得到的文件显示在输出中,而不应该出现在那里。我做错了什么

如果我的目录中有一个文件,但没有匹配的数据库值,我想删除该文件

                foreach( $ds as $id ){
                    foreach( $out as $file ){
                        if( $file != $id['patient_id'] ){
                            echo $id['patient_id'];
                        }
                    }
                }

首先,我认为使用嵌套的foreach循环是个坏主意;在我看来,从逻辑上讲,这些文件是错误的——文件不应该放在外面吗


我建议从数据库中构建一个数组,然后在文件上循环,并在数组中执行
以确定是否删除它们-这样做的方式将针对每一行结果循环所有文件;这不太好。

我不再做PHP了,所以我不能给你一个具体的答案,但我可以告诉你如何在更高的层次上解决这个问题:你想知道的是一个集合(磁盘上的文件)中的某些条目是否不在另一个集合(数据库)中。您可以通过设置差异来解决这个问题:set(磁盘上的文件)-set(数据库)=set(要删除的文件)。因此,首先需要一个数组,该数组包含数据库的patient_id字段的所有条目。您似乎已经有了一个带有文件名的数组。似乎要在PHP上计算集合差,您可以使用array_diff方法,如下所示:

$files_to_delete = array_diff($out, $patient_ids)

对不起,我的回答含糊不清,希望它还是有用的

为了进一步说明@DarkDust的答案,一种相当有效的方法(假设您使用的是原始PHP而不是框架)应该是:

$files = array()
$rows = array();

while($add = mysql_fetch_array(mysql_query('SELECT filename FROM files')) {
  $rows[] = $add[0]
}

...files code

foreach(array_diff($files, $rows) as $deletable) {
  unlink('/path/to/'.$deletable);
}

没错,史蒂夫。我也是这么说的。现在数据库中只有大约1000行,对于每行数据,我将得到1000次迭代。绝对正确。谢谢你的逻辑。Darkdust,谢谢你的回答和很好的解释。我试过Steve的建议,也试过你的建议,但我还是得到了一个错误的结果。如果你还在,也许你可以帮忙。
var\u dump
2个数组,并确保它们的格式相同,即只是文件名(假设所有文件都在同一目录中)。确认这一点,如果你仍然得到一个错误的结果,那么你的数据库或文件不是你所期望的。史蒂夫,再次感谢。你的第一个建议很管用。我的问题是,当我打印时,我发现我的数据库数组是多维的,我不相信in_数组和array_diff在多维数组上工作。我重建了MD阵列,生活再次变得美好。谢谢你的帮助我想这可能是个问题,因此,
$add[0]
:)谢谢你一直支持我!