Php 从数组中取消链接()
不太了解如何在数组中的每个项目上运行函数,这对PHP来说还是很新的,下面的Php 从数组中取消链接(),php,mysql,arrays,Php,Mysql,Arrays,不太了解如何在数组中的每个项目上运行函数,这对PHP来说还是很新的,下面的$pic_loc是一个从MySQL到图像的数据数组,其中包含路径和文件名,匹配执行的任何搜索条件 试图让unlink函数在找到的每个人身上运行。没有错误返回。我认为foreachforeach不是正确的方式,有人能给我指出正确的方向吗 $pic_loc = $cell_pictures['pic_loc']; //gathers an array from the database of files locations
$pic_loc
是一个从MySQL到图像的数据数组,其中包含路径和文件名,匹配执行的任何搜索条件
试图让unlink
函数在找到的每个人身上运行。没有错误返回。我认为foreachforeach
不是正确的方式,有人能给我指出正确的方向吗
$pic_loc = $cell_pictures['pic_loc']; //gathers an array from the database of files locations
$pics_to_delete .= "../../".$pic_loc; //corrects the directory
foreach($pics_to_delete as $pics_being_deleted) //deletes all pictures found
{
unlink($pics_being_deleted);
}
编辑:
我对这两个答案都做了很多修改,我知道我可以删除两层以上的文件,因为我可以毫无问题地删除单个文件。这就是我目前正在做的,我去掉了while()
循环,这可能是导致foreach功能出现问题的原因:
$data_array2 = mysql_query("SELECT * FROM pictures WHERE user_id = '".$id."'");
$cell_pictures = mysql_fetch_array($data_array2);
foreach($cell_pictures['pic_loc'] as $pics_being_deleted) //deletes all pictures found
{
unlink("../../".$pics_being_deleted);
}
下面是它现在返回的错误:
Warning: Invalid argument supplied for foreach() // on the line that the foreach is on
编辑:
好吧,那太疯狂了,但我明白了!!!您可能认为来自查询的数据应该是一个数组,但实际上您必须将其设置为数组。我就是这样做的:
$data_array2 = mysql_query("SELECT pic_loc FROM pictures WHERE user_id = '".$id."'");
while($cell_pictures = mysql_fetch_array($data_array2))
{
$the_pics = $cell_pictures['pic_loc'];
$pics_as_array = array($the_pics);
}
foreach($pics_as_array as $pics_being_deleted)
{
unlink("../../".$pics_being_deleted);
}
这个很好用。感谢大家花时间来阅读这篇文章!
-Mike如果$cell\u pictures['pic\u loc']是要删除的文件数组,则
foreach($cell_pictures['pic_loc'] as $pics_being_deleted) //deletes all pictures found
{
unlink("../../".$pics_being_deleted);
}
如果$cell_pictures['pic_loc']是要删除的文件数组,则
foreach($cell_pictures['pic_loc'] as $pics_being_deleted) //deletes all pictures found
{
unlink("../../".$pics_being_deleted);
}
实际上,
foreach
完全可以满足您的需求
但是,您需要在迭代中加入一些逻辑。让我们看看:
$directory = realpath("../../"); // the directory where files are placed
foreach ($pics_to_delete as $basename) //deletes all pictures found
{
$path = sprtinf('%s/%s', $directory, $basename);
unlink($path);
}
一个更好的选择是反过来做。首先获取目录和其中的所有文件,然后根据要删除的文件筛选该列表。仅当名称匹配时,才继续:
$dir = new DirectoryIterator($path);
$toDelete = new DeleteFilter($dir, $pics_to_delete);
foreach ($toDelete as $file)
{
printf("Delete: %s\n", $file->getPathname());
unlink($file->getPathname());
}
PHP附带了DirectoryIterator
,DeleteFilter
是一个小型FilterIterator
,它确保只返回与$pics\u to\u delete
数组匹配的真实文件和条目:
class DeleteFilter extends FilterIterator
{
private $filenames;
public function __construct(Iterator $iterator, array $filenames)
{
$this->filenames = $filenames;
parent::__construct($iterator);
}
public function accept()
{
$current = $this->getInnerIterator()->current();
if (!($current instanceof SplFileInfo)) {
return FALSE;
}
if (!$current->isFile()) {
return FALSE;
}
return in_array($current->getBasename(), $this->filenames);
}
}
您不需要过滤器迭代器,相反,您可以在
foreach
中编写该逻辑,但是我认为这一个更流畅。实际上foreach
对于您想要做的事情来说是完全正确的
但是,您需要在迭代中加入一些逻辑。让我们看看:
$directory = realpath("../../"); // the directory where files are placed
foreach ($pics_to_delete as $basename) //deletes all pictures found
{
$path = sprtinf('%s/%s', $directory, $basename);
unlink($path);
}
一个更好的选择是反过来做。首先获取目录和其中的所有文件,然后根据要删除的文件筛选该列表。仅当名称匹配时,才继续:
$dir = new DirectoryIterator($path);
$toDelete = new DeleteFilter($dir, $pics_to_delete);
foreach ($toDelete as $file)
{
printf("Delete: %s\n", $file->getPathname());
unlink($file->getPathname());
}
PHP附带了DirectoryIterator
,DeleteFilter
是一个小型FilterIterator
,它确保只返回与$pics\u to\u delete
数组匹配的真实文件和条目:
class DeleteFilter extends FilterIterator
{
private $filenames;
public function __construct(Iterator $iterator, array $filenames)
{
$this->filenames = $filenames;
parent::__construct($iterator);
}
public function accept()
{
$current = $this->getInnerIterator()->current();
if (!($current instanceof SplFileInfo)) {
return FALSE;
}
if (!$current->isFile()) {
return FALSE;
}
return in_array($current->getBasename(), $this->filenames);
}
}
您不需要过滤器迭代器,相反,您可以在
foreach
中编写该逻辑,但是我认为这一个更流畅。有时候,web主机设置是您无权删除或访问任何高于您的文件夹的文件。在您的情况下,您将向上移动两个文件夹
您可能需要重新构造程序,以便图片存储在试图删除它们的文件下面
此外,请确保传递正确的文件名字符串以取消链接。如果您不确定,可以回显文件名以进行测试。有时,web主机设置为您无权删除或访问任何高于您所在文件夹的文件。在您的情况下,您将向上移动两个文件夹 您可能需要重新构造程序,以便图片存储在试图删除它们的文件下面
此外,请确保传递正确的文件名字符串以取消链接。如果您不确定,可以回显文件名以进行测试。有一个
array\u walk
函数,但是foreach也不是那么糟糕。@user1053263那么有什么问题吗?图片没有被删除?似乎$Pics_to_delete是一个字符串,而不是一个可以通过foreach访问的数组。如果你想获取一个目录中所有文件的数组,请使用scandir
函数。@ozzy,是的,图片没有被删除,John,我只是假设它是一个数组,因为我使用mysql\u fetch\u array()来获取数据。有一个array\u walk
函数,但foreach也没那么糟糕。@user1053263那么问题出在哪里?图片没有被删除?似乎$Pics_to_delete是一个字符串,而不是一个可以通过foreach访问的数组。如果你想获取一个目录中所有文件的数组,请使用scandir
函数。@ozzy,是的,图片没有被删除,John,我只是假设它是一个数组,因为我使用mysql\u fetch\u array()来获取数据。我将尝试你的第二个选项。这是一堆!第二种选择有效!我只是不能用它,因为我想它扫描目录会对高清更具吸引力。我要试试你的第二个选择,一堆!第二种选择有效!我只是无法使用它,因为我认为它扫描目录会对高清更具吸引力。$file=$cell_pictures['pic_loc'];foreach($pics\u文件被删除)。在您编辑的代码中尝试此操作。$file=$cell_pictures['pic_loc'];foreach($pics\u文件被删除)。在您编辑的代码中尝试此操作。