Php 使用basename()

Php 使用basename(),php,html,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)

我们有一个程序可以将图像导出为.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中循环遍历所有标记为*的目录和子目录。这一部分现在已经完成,只需将相应文本文件的内容绑定到中。

您的问题是
glob()
仅在当前目录中查找。由于您只需要
.bmp
文件,因此您的代码应该更像:

<?php
foreach(glob('*.bmp') as $file){
  $base = file_get_contents(basename('$file', '.bmp').'.txt');
  echo "<img src='$file' /><div>$base</div>";
}
?>
您试图访问一个变量(查找)、忘记引号等。请在学习时做好准备。这可能是一段艰难的旅程

希望这有点教育意义


如果这不符合您的目的,请查看
readdir()
。您必须使用循环筛选出不需要的文件。请注意,我们不是来为您工作的,只是教您如何做。

您的语法对于GLOB是错误的。我认为它需要一个目录路径和filematch模式。我认为将其保留为空可能会返回所有文件

好的…我明白你的问题了。现在你已经添加了更多的细节。 您要做的是迭代所有图像(或目录中的文本文件),然后检查图像和文本文件是否存在

 <?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" >';
      }

    }  
 }     
 ?>

您可能希望在此处与一起使用:

class filefilterator扩展filterator
{
公共功能接受()
{
$file=$this->getInnerIterator()->current();
return($file->getExtension()='bmp')&&file\u存在(
“{$file->getPath()}/{$file->getBasename('bmp')}txt”);
}
}
foreach(新的FileFilterIterator(新的递归迭代器(
新的递归目录迭代器('Photos/Marshfield'))作为$file){
printf(“”,$file->getPathname());
printf('Text file:%s',“{$file->getPath()}/{$file->getBasename('bmp')}txt”);
}

PS:我已经添加了
file_exists()
根据您的评论检查“我需要确保图像文件与使用它创建的正确文本文件相关联”。

那么您实际遇到的问题是什么?您希望如何使用此
${$dic.$base}
?您应该使用
glob(*/*.bmp”)
只获取一种文件。这里也可以用
intval()
代替
basename()
。您可能想要输出的是
echo“";。我想他是在把两个变量结合起来,以创建一个新名称。1。您已将本地路径零件添加到img标记中。可能您应该使用服务器相对路径。2.您可以使用glob,比如$dir='...bmp';通过这种方式,文件名的创建可以简单得多。3.我也不理解${$dic.$base}路径…${}将花括号内的任何内容转换为变量;和$b=2;然后$c={$a.$b}=$12;我同意这会返回我想要的图像文件,但我需要确保图像文件与使用它创建的正确文本文件相关联。由于glob的作用域是本地目录,我指定了Photos/Marshfield/*/*两个我需要循环的目录,您认为从中开始比较好吗Photos/Marshfield/*并执行嵌套的foreach循环以遍历*处的所有目录?您不能
glob()
您不在的目录中,因此子目录循环上的循环将不会有任何好处。我对我的首字母进行了编辑,以指示我正在谈论的内容,使用glob()循环遍历我的子目录。你给了我一个想法:)在这种情况下,我在同一个目录中调用我的站点,其中包含照片,我相信这将使其成为绝对路径,因此我想我认为没有必要使用$absPath。$absPath是可选的,但我发现当您在远程服务器上,并且有URL重写时,它会有所帮助,或者在更复杂的网站上有漂亮的URL等等。很抱歉,我还没有完全理解你正在做的事情的结构。我不知道如何使用我完全不懂的东西。
recursivedirectoryinterator
递归地迭代所有目录文件,就像
glob()
使用
*
模式一样<代码>递归迭代器
迭代先前的递归迭代器
filefilterator
是我们刚刚创建的一个类,它扩展了
filterator
<?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>";
?>
echo "div id='someId'>{$img['ArrayKeyHere']}</div>";
 <?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" >';
      }

    }  
 }     
 ?>
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");
}