Я пишу скрипт, который будет выбирать случайное слово из слов во входном файле несколько раз. Теперь вызов file()
несколько раз кажется неэффективным, поэтому я думаю о наличии глобального массива для слов из файла и функции, которая будет загружать файл в массив (вызываемый перед выбором случайных слов). Почему это не работает?
global $words; function init_words($file) { $words = file($file); $count = count($words); echo "$count words<br>\n"; // "3 words" } init_words("/foo/bar"); $count = count($words); echo "$count words<br>\n"; // "0 words"
Вам нужно объявить $words
global внутри самой функции. Видеть:
$words = ''; function init_words($file) { global $words; $words = file($file); $count = count($words); echo "$count words<br>\n"; // "3 words" }
Предлагаю вам ознакомиться с главой раздела переменной в руководстве по PHP.
В стороне я никогда не буду писать этот код таким образом. Избегайте глобализации, если они не являются абсолютно необходимыми.
Я бы написал ваш код таким образом, чтобы избежать этой проблемы:
function init_words($file) { $words = file($file); $count = count($words); echo "$count words<br>\n"; // "3 words" return $words; } $words = init_words("/foo/bar"); $count = count($words); echo "$count words<br>\n"; // "3 words"
Дополнительную информацию об этом см. В главе « Возвращаемые значения» в руководстве по PHP.
Вы хотите global $words;
внутри функции. Еще лучше, используйте суперглобальные $GLOBALS
.
$words = null; function init_words($file) { global $words; $words = file($file); $count = count($words); echo "$count words<br>\n"; // "3 words" } init_words("/foo/bar"); $count = count($words); echo "$count words<br>\n"; // "0 words"
global
часть должна войти в вашу функцию
Примечание: не всегда лучше использовать глобальные операторы
сначала вам нужно сохранить слова в сериализованном форманте, чтобы
$file_location = "/foo/bar/words.txt"; $words = array("game", "cool", "why"); $words = serilize($words); write_words_file($words, $filelocation); //Create the function so it can write to a file
то вам нужно будет отредактировать свои init_words
function init_words($file) { global $words; $data = file_get_contents($file); $words = unserialize($data); $count = count($words); echo "$count words<br>\n"; // "3 words" } init_words("/foo/bar/words.txt"); $count = count($words); echo "$count words<br>\n"; // "0 words"
В качестве альтернативы вы можете использовать следующее и избегать global
использования:
function init_words($fname) { $w = file($fname, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // We don't want the trailing spaces or empty lines. $c = count($w); return array($w, $c); } list($words, $count) = init_words("Some_File.txt");
В такой ситуации, когда вам приходилось делать какие-либо манипуляции с списком слов, вы можете обрабатывать все это в init_words()
а не в другом месте сценария.