使用basename()

时间:2013-11-18 22:40:26

标签: php html

我们有一个程序将图像导出为.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中标记为*的所有目录和子目录。现在只需将相应文本文件的内容绑定在。

中即可完成该部分

3 个答案:

答案 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)

您可能希望RecursiveDirectoryIteratorFilterIterator一起使用:

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()“我需要确保图片文件与使用它创建的正确文本文件相关联”