我正在编写一个脚本,它会多次从输入文件中的单词中选择一个随机单词。现在多次调用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"
答案 0 :(得分:5)
您需要在函数本身内声明$words
全局。参见:
$words = '';
function init_words($file)
{
global $words;
$words = file($file);
$count = count($words);
echo "$count words<br>\n"; // "3 words"
}
我建议你查看PHP手册中的variable scope chapter。
顺便说一句,我绝不会以这种方式编写这段代码。除非绝对必要,否则请避免使用全局变量。
我会以这种方式编写代码以避免此问题:
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手册中的returning values chapter。
答案 1 :(得分:2)
你想在函数里面global $words;
。更好的是,使用超全球$GLOBALS
。
答案 2 :(得分:1)
$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
部分应该进入你的功能
旁注:使用全局运算符并不总是最好的
答案 3 :(得分:0)
首先,您需要将单词存储在序列化的共振峰中,这意味着
$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"
答案 4 :(得分:0)
或者,您可以使用以下内容并完全避免使用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()
内完成所有操作,而不是在脚本的其他地方。