PHP не может искать определенные слова в массиве, созданном из файла

Я пытался извлечь определенные слова из массива, созданного из текстового файла с помощью функции file() в php.

Текстовый файл sample.txt выглядит следующим образом:

A registration has been received. 

Name: test
Lastname: test2 
Email: [email protected]
Company/School: Test2
Company2: test3
Address1: test4
Address2: test5
City: test6
State: test7
Country: test8
Zipcode: test9

Теперь я использовал функцию file(), чтобы поместить этот текстовый файл в массив.

$file_name='sample.txt';
$file_array=file($file_name);

Затем я прошел через цикл, чтобы извлечь каждое значение и найти слово, скажем, «Имя» из этого массива.

    $data1='Name';

    foreach($file_array as $value){
    if(stripos($value,$data1)===FALSE)
        echo "Not Found";
     else 
       echo "Found";
    }

Но он всегда печатает «Не найдено». Я пытался использовать strpos,strstr, preg_match, но безрезультатно. Также, если я использую обычный массив слов вместо создания из файла, он работает правильно.

Заранее спасибо.

Обновление. Моя цель в этой задаче — сначала определить, какое поле это ex. «Имя», а затем его значение, например. 'контрольная работа'


person Sugat    schedule 26.07.2011    source источник


Ответы (2)


Это, безусловно, может быть проблема с окончанием строки или проблема с кодировкой вашего файла, я точно не знаю, как file() обрабатывает пробелы.

В качестве предложения по улучшению кода, если вы создаете массив с ключами из данных, вы можете использовать более надежную функцию array_key_exists() для поиска ваших полей.

$file_name = 'sample.txt';
$file_data = file($file_name);

// loop through each line
foreach ($file_data as $line) {

// from each line, create a two item array
$line_items = explode(":", $line);

// build an associative (keyed) array
// stripping whitespace and using lowercase for keys
$file_array[trim(strtolower($line_items[0]))] = trim($line_items[1]);
}

Теперь вы можете использовать array_key_exists следующим образом:

if (array_key_exists("name", $file_array) === false) {
  print "Not found.";
} else {
  print "Found.";  
  // and now it's simple to get that value
  print "<br />Value of name:  " . $file_array['name'];
}
person Matthew    schedule 26.07.2011
comment
Я бы попробовал использовать print_r($file_array) и определить, как выглядят ваши ключи. - person Matthew; 27.07.2011
comment
Я вижу вашу точку зрения. Таким образом, ключи на самом деле являются числами, подобными этому [2] => Имя: тест. Таким образом, я могу получить имя, указав число, и в этом случае это 2 вместо имени. Но в этом случае я должен сначала увидеть ключ массива, а затем соответствующим образом изменить значение, поэтому, если положение имени изменится в любом текстовом файле, мой скрипт сломается. Но в любом случае большое спасибо, так как это может работать на данный момент. - person Sugat; 27.07.2011
comment
Также здесь я не совсем ищу строку Name, а просто смотрю на позицию и извлекаю ее значение, не имея возможности проверить, содержит ли она поле Name или нет. - person Sugat; 27.07.2011
comment
Что ж, я пытался намекнуть вам на ситуацию, когда этот массив выглядел так: имя => test, фамилия => test2, электронная почта => [email protected] и т. д. Таким образом, каждая строка слева от ваше двоеточие становится ключом в массиве и, следовательно, доступно для поиска с помощью array_key_exists(). - person Matthew; 30.07.2011

скорее всего, у вас все еще есть символы новой строки в конце каждой «строки» в вашем массиве. Попробуйте загрузить так:

$file_array=file($file_name, FILE_IGNORE_NEW_LINES);
person Marc B    schedule 26.07.2011
comment
В основном это --› array(13) { [0]=› string(70) ÿþA регистрация была получена. [1]=› строка(1) [2]=› строка(21) Имя: test [3]=› строка(33) Фамилия: test2 .....продолжение} - person Sugat; 27.07.2011
comment
строка (21) для имени: тест? Является ли входной файл в UTF-16? Вам нужно будет преобразовать в UTF-8 или использовать строковые функции mb_stripos (многобайтовые). - person Marc B; 27.07.2011
comment
Пробовал mb_stripos, но снова не сработало. На самом деле я также пытался преобразовать каждое значение в utf-8 раньше с помощью $value=utf8_encode($value), и это тоже не сработало. - person Sugat; 27.07.2011
comment
Я попробовал mb_stripos с внутренней кодировкой, такой как mb_stripos($value,$data1), а также специально упомянул utf-8, например mb_stripos($value,$data1,UTF-8). Это правильно? - person Sugat; 27.07.2011
comment
Да, но utf8_encode() для iso8859-1 -> utf8, вы начинаете с utf-16. Вместо этого попробуйте mb_convert_encoding(). - person Marc B; 27.07.2011