我们有一个程序将图像导出为.bmp并创建一个关联的.txt文件。每个文件都是以递增方式生成的,因此第一个文件集的名称为0.bmp和0.txt,第二个为1.bmp和1.txt等。我有以下内容
<?php
$dir = "Photos/Marshfield/*";
foreach(glob($dir) as $sub)
{
$path = $sub."/*";
foreach(glob($path) as $file)
{
echo "<img src=".$file.">";
}
}
?>
要在回显$ base时进一步添加故障排除,您将获得以下内容:0.bmp0.txt1.bmp1.txt2.bmp2.txt3.bmp3.txt4.bmp4.txt5.bmp5.txt6
,它将文件视为这两部分。我会说实话,我今天大部分时间都在学习php,以至于我能够将上述内容放在一起。如果不能很好地了解语言,有人可以就如何确保每个目录的相应图像/文本关联是正确的提供一些指导吗?我想如果我能把两者分开,我可能会进一步努力,但我不确定最好的方法。
在指定的目录“Photos / Marshfield”中,每个目录中都有一系列目录(比如D1,D2,D3等),每个目录都有一个0.bmp / 0.txt的文件列表, 1.bmp / 1.txt等组合。我想做的是遍历所有目录并在每个子目录(D1,D2等)内匹配并显示图像文件和相应的文本文件。最初我曾希望加入$ dic和$ base我可以调用图像的来源,因为它们在数字上递增。 $ dic会生成“Photos / Marshfield / D1并使用我的.bmp文件的基本名称,我应该得到一个数字,当它被添加回.bmp完成文件路径时。我对basename()的期望是返回字符串文件的值(在这种情况下为0,1,2等)而不是它返回0.bmp0.txt作为文件,我希望这有助于澄清。我没有得到产生阅读文本文件的内容虽然我把那部分放下来。
我更新了我的代码,以循环遍历路径$ dir中标记为*的所有目录和子目录。现在只需将相应文本文件的内容绑定在。
中即可完成该部分答案 0 :(得分:0)
glob()
仅在当前目录中查找的问题。由于您只需要.bmp
文件,因此您的代码应该更像:
<?php
foreach(glob('*.bmp') as $file){
$base = file_get_contents(basename('$file', '.bmp').'.txt');
echo "<img src='$file' /><div>$base</div>";
}
?>
就个人而言,我喜欢让我的PHP与HTML分开,所以如果你想把所有的结果放在一起我真的会这样做:
<?php
$out = ''
foreach(glob('*.bmp') as $file){
$base = file_get_contents(basename('$file', '.bmp').'.txt');
$out .= "<img src='$file' /><div>$base</div>";
}
echo $out; // anywhere you want
?>
如果您想将每个结果放在任何地方,那么:
<?php
foreach(glob('*.bmp') as $file){
$base = file_get_contents(basename('$file', '.bmp').'.txt');
$img[] = "<img src='$file' />";
$div[] = "<div>$base</div>";
}
echo "<div id='someId'>$img[3]</div>";
?>
现在您可以访问$div[0]
或其他任何内容并将其粘贴在双引号包围的HTML之间。只要确保你有一个关联数组元素,用{}
包围它,如:
echo "div id='someId'>{$img['ArrayKeyHere']}</div>";
您尝试访问变量变量(查找),忘记引号等。在学习的同时支撑自己。这可能是一次艰难的旅程。
希望这有点教育。
如果这不符合您的目的,请查看readdir()
。您将不得不使用循环来过滤掉您不想要的文件。请注意,我们不是为您做的工作,只是教你如何做。
答案 1 :(得分:0)
GLOB的语法错误。我认为它需要一个目录路径和filematch的模式。我认为将它留空可能会返回所有文件。
好的......我收到了你的问题。现在您已经添加了更多细节。 你想要做的是迭代所有图像(或目录中的文本文件),然后检查图像&amp;文本文件存在。
<?php
$absPath = 'ABSOLUTE PATH TO YOUR FILES';
$dir = $absPath . "Photos/Marshfield/";
$matches = glob($dir."*.bmp");
if(is_array($matches)) {
$txtFile = '';
foreach(glob($dir.'*.bmp') as $key=>$file ) {
//Creates the base name without the extension
$base = basename($file,".bmp");
$txtFile = $base . $key .'.txt <br />';
if(file_exists($txtFile)) {
//File and Img
echo $txtFile .'<br />';
echo '<img src="'.$absPath . $dir. $base . $key . '.bmp" >';
} else {
echo 'No text file found';
echo '<img src="'.$absPath . $dir. $base . $key . '.bmp" >';
}
}
}
?>
答案 2 :(得分:0)
您可能希望RecursiveDirectoryIterator
与FilterIterator
一起使用:
class FileFilterIterator extends FilterIterator
{
public function accept()
{
$file = $this->getInnerIterator()->current();
return ($file->getExtension() == 'bmp') && file_exists(
"{$file->getPath()}/{$file->getBasename('bmp')}txt");
}
}
foreach (new FileFilterIterator(new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('Photos/Marshfield'))) as $file) {
printf('<img src="%s" />', $file->getPathname());
printf('Text file: %s', "{$file->getPath()}/{$file->getBasename('bmp')}txt");
}
PS:我已根据您的评论添加了file_exists()
次“我需要确保图片文件与使用它创建的正确文本文件相关联”。