Получить файлы из одного каталога и читать файлы в другом, чем сопоставлять файлы с содержимым файлов

Чтобы объяснить, что я имею в виду, у меня есть 1 каталог, содержащий изображения. У меня есть другой, содержащий текстовые файлы с информацией об изображениях. Я хочу, чтобы массив с каждым изображением соответствовал другому массиву, содержащему его данные.

Моя голова начинает взрываться, пытаясь решить эту проблему, и мои знания PHP (особенно массивов) довольно малы. Если бы кто-то мог помочь исправить то, что у меня есть, и, возможно, помочь объяснить, что происходит (или указать мне сайт, который объясняет), я был бы очень признателен за это.

Вот мой код до сих пор:

<?php
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
ini_set('display_errors',1);

function loadImages()
{
  $images=array();

  if ($handle = opendir($_SERVER['DOCUMENT_ROOT'].'/img/gallery')) {

     $imageData = loadImageData();

      $count = 0;
      while (false !== ($entry = readdir($handle))) {

          if ($entry != "." && $entry != "..") {
              if((end(explode(".", $entry)) == "jpg") || (end(explode(".", $entry)) == "jpeg") || (end(explode(".", $entry)) == "JPG") || (end(explode(".", $entry)) == "gif") || (end(explode(".", $entry)) == "png")) {
                $images[$imagedata[$count]] = $entry;
                $count += 1;
              }
          }
      }

  }
        var_dump($images);

      closedir($handle);
      return $images;
}

function loadImageData()
{
  $imageData=array();

  if ($handle = opendir($_SERVER['DOCUMENT_ROOT'].'/img/gallery/data/')) {

      $count = 0;
      while (false !== ($entry = readdir($handle))) {

          if ($entry != "." && $entry != "..") {
              if(end(explode(".", $entry)) == "txt") {
                $path = $_SERVER['DOCUMENT_ROOT'].'/img/gallery/data/';

                $file = fopen($path.$entry, "r") or die("Something went wrong gathering photo information. I suggest you contact the server admin about this.");
                $fileData = array();

                $line = 0;
                while(! feof($file)) {
                  $lineData = fgets($file);

                  $lineData = str_replace("\n", "", $lineData);
                  $lineData = str_replace("\r", "", $lineData);

                  $fileData[$line] = $lineData;
                  $line++;
                }

                fclose($file);

                $imageData[$count] = $fileData;
                $count += 1;
              }
          }
      }
  }

  closedir($handle);
  return $imageData;
}
?>

2 ответа

Решение

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

Отредактировал исходный код, инкапсулировав код в функцию, так что теперь вы можете вызывать функцию и обрабатывать ее возвращаемое значение.

    function get_gallery_images(){

        /*

        */
        $imgdir=$_SERVER['DOCUMENT_ROOT'].'/img/gallery';
        $extns=array('jpg','jpeg','png','gif');
        $output=array();



        /*
            Could have done this without the recursive iterators but... 
        */
        foreach( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $imgdir, RecursiveDirectoryIterator::KEY_AS_PATHNAME), RecursiveIteratorIterator::CHILD_FIRST ) as $file => $info ) {
            if( $info->isFile() ){

                $ext=strtolower( pathinfo( $file, PATHINFO_EXTENSION ) );
                $name=pathinfo( $file, PATHINFO_FILENAME );

                /* Only get images that have correct extension */
                if( in_array( $ext, $extns ) ) {

                    /* As data and image have the same name - we can deduce a filename */
                    $textfile=$imgdir . '/data/' . $name . '.txt';

                    /* Get image properties */
                    list( $width, $height, $type, $attr ) = getimagesize( $file );

                    /* If the text file does exist, add this image and associated data & properties to the output array */
                    if( file_exists( $textfile ) ){
                        clearstatcache();
                        $output[ $name ]=array( 'path' => $info->getPath(), 'data'=>file_get_contents( $textfile ), 'width'=>$width, 'height'=>$height, 'size'=>filesize( $file ) );
                    }
                }
            }
        }
        /* Process the output array in whatever whay you see fit */
        return $output;
    }


    /* Call the function */
    $output = call_user_func( 'get_gallery_images' );

    if( !empty( $output ) ){
        /* do whatever processing you require */
        foreach( $output as $key => $arr ){
            echo $key.' '.$arr['data'].'<br />';
        }
    }

Пошаговое решение:

  1. Вам нужно получить изображения из папки, где у вас есть изображения:

$temporaryImageArray = scandir($_SERVER['DOCUMENT_ROOT'].'/img/gallery/');

  1. Вам нужно получить текстовые файлы из папки, где у вас есть текстовые файлы:

$temporaryTextArray = scandir($_SERVER['DOCUMENT_ROOT'].'/img/gallery/данные/');

  1. Оба временных массива могут содержать ненужные элементы, такие как подкаталоги. Например, ваша папка с изображениями содержит подкаталог data, который бесполезен. Поэтому вам нужно подготовить полезное подмножество массива изображения:

$images = array(); foreach ($temporaryImageArray as $temporaryImage) { if (is_file($_SERVER['DOCUMENT_ROOT'].'/img/gallery/'.$temporaryImage)) { $images[]=array("imgSrc" => $_SERVER['DOCUMENT_ROOT'].'/img/gallery/'.$temporaryImage); } }

  1. а также подготовить полезное подмножество текстов:

$texts = array(); foreach ($temporaryTextArray as $temporaryText) { if (is_file($_SERVER['DOCUMENT_ROOT']. '/img/gallery/data/'.$temporaryText)) { $texts[]=array("name" => $_SERVER['DOCUMENT_ROOT']. '/img/gallery/data/'.$temporaryText, "content" => file_get_contents($_SERVER['DOCUMENT_ROOT'].'/img/gallery/data/'.$temporaryText)); } }

  1. Наконец, поиск совпадений:

foreach ($images as $imageKey => $imageValue) { $imageContent = file_get_contents($imageValue["imgSrc"]); $images[$imageKey]["matches"] = array(); foreach ($texts as $text) { if (file_get_contents($text["content"]) === $imageContent) { $images[$imageKey]["matches"][]=$text["name"]; } } }

Обратите внимание, что в решении не предполагается, что совпадение вообще существует, и если есть совпадение, оно является уникальным. Тем не менее, бремя тестирования остается на вас, не стесняйтесь сообщить мне, если у вас есть какие-либо проблемы. Намерение состоит в том, чтобы иметь $images массив, который будет содержать массивы, имеющие "imgSrc" элемент и "matches" элемент, который будет содержать набор совпадающих имен текстовых файлов.

Другие вопросы по тегам