Как получить содержимое текстовых файлов как значение в цикле foreach в функции glob в php?

0

Я разрабатываю поисковую систему с векторной моделью пространства. Я успешно вычислил tf-idf с данными ассоциативного массива, которые уже определены в коде. Теперь я хочу, чтобы данные были получены из каталога, в котором у меня есть папки, и в каждой папке есть несколько текстовых файлов с фиктивными данными. Я пробовал много, но застрял в 1 точке, используя функцию glob, потому что я хочу, чтобы все .txt- файлы были как ключ, а его содержимое как значение в цикле foreach функции glob... Ниже мой код.

Tf-idf с ассоциативными данными массива

$collection = array(
1 => 'this string is a short string but a good string',
2 => 'this one isn\'t quite like the rest but is here',
3 => 'this is a different short string that\' not as short'
);

$dictionary = array();
$docCount = array();

foreach($collection as $docID => $doc) {
    $terms = explode(' ', $doc);
    $docCount[$docID] = count($terms);

    foreach($terms as $term) {
        if(!isset($dictionary[$term])) {
            $dictionary[$term] = array('df' => 0, 'postings' => array());
        }
        if(!isset($dictionary[$term]['postings'][$docID])) {
            $dictionary[$term]['df']++;
            $dictionary[$term]['postings'][$docID] = array('tf' => 0);
        }

        $dictionary[$term]['postings'][$docID]['tf']++;
    }
}

$temp = ('docCount' => $docCount, 'dictionary' => $dictionary);

Как вы видите в первом цикле foreach, это $ DocID является ключевым, а $ doc - его содержимым (значением) массива коллекции. Но я не знаю, как реализовать то же самое, когда файлы читаются из каталога. См. Код ниже..

Tf-idf С.txt Файлы и его содержимое читаются из каталога

foreach (glob("C:\\wamp\\www\\Web-info\\documents\\awd_1990_00\\*.txt") as $file) {
    $file_handle = fopen($file, "r");
    //echo $file;
    $dictionary = array();
    $docCount = array();

    foreach($file as $docID=> $value) {
        echo $value;
        $terms = explode(' ', $doc);
        $docCount[$docID] = count($terms);

        foreach($terms as $term) {
            if(!isset($dictionary[$term])) {
                $dictionary[$term] = array('df' => 0, 'postings' => array());
            }
            if(!isset($dictionary[$term]['postings'][$docID])) {
                $dictionary[$term]['df']++;
                $dictionary[$term]['postings'][$docID] =     array('tf' => 0);
            }

            $dictionary[$term]['postings'][$docID]['tf']++;
        }
    }
}
$temp = array('docCount' => $docCount, 'dictionary' => $dictionary);

Это дает мне ошибку в 1-м цикле foreach, который недействителен для сжатия в цикле foreach. Как я уже упоминал ранее, я хочу, чтобы файлы.txt были ключом и его содержимое в качестве значения в первом цикле foreach. Но я получил эту ошибку. Кто-нибудь может рассказать мне, как это сделать.. Спасибо заранее.

  • 0
    Я не понимаю, что ты пытаешься сделать. $file - это просто имя файла, что вы зацикливаете на foreach ? Если вы хотите while ($line = fgets($file_handle) строки, используйте while ($line = fgets($file_handle) .
  • 0
    @Barmar Barmar Спасибо за ответ. Я пытаюсь, чтобы имена файлов были получены как ключ, а его содержимое - как значение в 1-м цикле foreach в соответствии с моими требованиями, и не нужен еще один цикл while для получения его содержимого. Все содержимое должно попасть в функцию glob. Является ли это возможным??
Теги:
loops
foreach

1 ответ

0

Если вы хотите обрабатывать весь файл как одно значение, вы можете использовать file_get_contents() для чтения файла в строку:

$dictionary = array();
$docCount = array();
foreach (glob("C:\\wamp\\www\\Web-info\\documents\\awd_1990_00\\*.txt") as $docID) {
    $value = file_get_contents($docID);
    ...
}
  • 0
    Спасибо @Barmar. Теперь я получаю содержимое файла как значение. Но все же осталась одна проблема: я хочу, чтобы имена файлов были ключевыми, а не числами ([0], [1], [2] и т. Д.). Я хочу вот так ([1 .txt] => его содержание, [2.txt] => его содержание и т.д.) ... Большое спасибо за ваш ответ.
  • 0
    Вы не можете повторить тот же ключ в массиве. Все строки в файле имеют одинаковое имя файла.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню