2013-11-18 5 views
0

У нас есть программа, которая экспортирует изображение как .bmp и создает связанный .txt-файл. Каждый файл генерируется постепенно, так что первый набор файлов называется 0.bmp и 0.txt, второй 1.bmp и 1.txt и т.д. У меня есть следующиеИспользование basename()

<?php 
    $dir = "Photos/Marshfield/*"; 
    foreach(glob($dir) as $sub)  
    { 
     $path = $sub."/*"; 
     foreach(glob($path) as $file) 
     { 
      echo "<img src=".$file.">"; 
     } 
    }  
    ?> 

Для дальнейшего добавить к стрельбе неприятности когда вы echo $ base вы получаете следующее: 0.bmp0.txt1.bmp1.txt2.bmp2.txt3.bmp3.txt4.bmp4.txt5.bmp5.txt6, он видит файл как эти две части. Я буду честен, мне потребовалось большую часть сегодняшнего дня, чтобы изучить php до такой степени, что я смог собрать все вместе. Не зная язык очень хорошо, может ли кто-нибудь дать некоторые рекомендации о том, как я могу гарантировать правильность соответствующей ассоциации изображений и текстов в каждом каталоге? Я думаю, что если бы я мог разбить две части, я мог бы работать дальше, но я не уверен в лучшем подходе.

В каталоге, указанном «Фотографии/Маршфилд», есть серия каталогов (например, 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 в качестве файла, я надеюсь, что это поможет уточнить. Я не стал создавать содержимое для чтения текстового файла, хотя я имеют ту часть вниз.

Я обновил свой код, чтобы перебрать все каталоги и подкаталоги помечены как * в путь $ реж. Та часть завершена теперь только связывая содержание соответствующего текстового файла в.

+0

Так в чем же проблема? Что вы ожидаете от этого '$ {$ dic. $ Base}'? –

+0

Вы должны использовать 'glob (" */*. Bmp ")', чтобы получить только один вид файлов. Также 'intval()' будет достаточно здесь на месте 'basename()'. То, что вы, вероятно, предназначалось для вывода, - 'echo '"; '. – mario

+0

Я думаю, что он соединяет две переменные, чтобы создать новое имя. – CharlieM

ответ

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(). Вам придется использовать цикл для фильтрации файлов, которые вы не хотите. Обратите внимание, что мы не здесь, чтобы делать вашу работу за вас, просто научите вас, как это сделать.

+0

Я бы согласился, что это возвращает файлы изображений, которые я хочу, но мне нужно убедиться, что файл изображения связан с правильным текстовым файлом, созданным с ним. – TargetofGravity

+0

Поскольку область действия glob является локальным каталогом, и я указывал «Фото/Marshfield/*/* два каталога, мимо которых мне нужно прокручиваться, вы думаете, что лучше начать в Photos/Marshfield/* и сделать вложенный foreach чтобы пройти через все каталоги в *? – TargetofGravity

+0

Вы не можете 'glob()' каталог, в котором вы не находитесь, поэтому цикл над контурами подкаталогов не принесет пользы. – PHPglue

0

Ваш синтаксис неверен для 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" >'; 
     } 

    } 
}  
?> 
+0

В этом случае я вызываю свой сайт в том же каталоге, что и фотографии, которые, я считаю, сделают это абсолютным путем, поэтому, я думаю, я не вижу необходимости в $ absPath. – TargetofGravity

+0

$ absPath не является обязательным, но я нахожу его полезным, когда вы находитесь на удаленном сервере, и у вас есть перезаписи URL или симпатичные URL-адреса и т. П. На более сложных сайтах. – CharlieM

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() проверки за ваш комментарий «Мне нужно, чтобы убедиться, что файл изображения связан с правильный текстовый файл, созданный с ним ".

+0

Приносим извинения, но пока еще недостаточно, чтобы полностью понять структуру того, что вы делаете. Я не использую то, что полностью не понимаю. – TargetofGravity

+0

'RecursiveDirectoryIterator' повторяет все файлы каталога, рекурсивно, как' glob() 'делает с' * 'шаблоном. 'RecursiveIteratorIterator' выполняет итерацию предыдущего рекурсивного итератора. 'FileFilterIterator' - это класс, который мы только что создали, который расширяет' FilterIterator', который реализует метод 'accept()', который будет фильтровать все файлы на основе ваших собственных условий (в этом случае все имена файлов с расширением bmp, которые имеют одинаковое базовое имя файл с расширением «txt»). Затем 'foreach' выполняет итерацию всех согласованных файлов и дает вам методы для получения имени пути, имени файла и т. Д. :) –

Смежные вопросы