在线工具 在线编程 在线白板 在线工具 在线编程 在线白板

PHP file_get_contents()读入文件问题?

PHP file_get_contents()读取str.txt文件,文件内容如下
陈一
刘二
李四
张三
explode("/n/r",$str)后得到的数组print_r后是:Array ( [陈一 刘二 李四 张三]),
无法用array_key_exists($key,$str)检查是否包含“刘二”“张三”这些字符串,
请教应该如何处理?
最新回答
醉不成欢

2025-03-02 02:37:32

因为explode得到数组key是0、1、2、3,因此无法使用array_key_exists来检查是否存在行,应该使用array_search来检测行的位置,另外读入再拆分可以直接使用file,建议代码为:
$arr=file('str.txt');
if (array_search('刘二',$arr)===FALSE) echo '没有刘二';
注意,array_search结果是找到的key,因此可能为0,没有找到返回的是FALSE,判断的时候要使用三个等号

此外,上面的思路只使用大文件中进行少量的搜索,如果是需要反复许多次这样搜索数组,效率更好的办法是使用array_flip把数组的键和值兑换,随后的搜索效率更高。

$arr=array('陈一','刘二','李四','张三');
print_r($arr);//0=>'陈一',1=>'刘二',2=>'李四',3=>'张三'
$arr2=array_flip($arr);
print_r($arr2);//'陈一'=>0,'刘二'=>1,'李四'=>2,'张三'=>3
追问
修改后截取和手环出错:
if($tmpcontents)
{
$wordsdic=explode("/n/r",$tmpcontents); //这行出错
$i=0;
$ttwords=array();
foreach($wordsdic as $value) //这行出错
追答
/n/r拆分不了,我以为只是发帖手误,建议拆分后的$wordsdic输出观察一下。
追问
问题是无法得到$arr=array('陈一','刘二','李四','张三');
只有$arr=array('陈一 刘二 李四 张三');
追答
这是file_get_contents获得的吗,仔细检查,看看姓名之间的分隔符是什么,没有/n/r,explode是分不开的。根据你的最后补充,我看应该使用空格分隔来拆分,但如果是从文件获得,分隔符是换行,不是空格。换行的表示与文件格式相关,UNIX是\n,WINDOWS是\r\n,MAC是\r,是不是很复杂,为什么不用file
追问
用file()出错
if($tmpcontents)
{
$wordsdic=explode("/n/r",$tmpcontents); //这行出错
$i=0;
$ttwords=array();
foreach($wordsdic as $value) //这行出错
追答
你知道你写的/n/r是什么意思吗?我前面说了半天你都没看呀,转义符的方向反了,应该是\n这样写,而且具体是\n还是\r与文件的格式有关。这是第一个需要搞清楚的问题。
出错是什么意思?根据错误提示来修改语句,看了错误提示没有,找到错误的地方没有
追问
现在用file()读出来的内容print_r后是Array ( [0] => 啊啊啊 [1] => 阿埃二氏病变 [2] => 阿埃二氏手术 ......)

if($tmpcontents)
{
$wordsdic=explode("\n",$tmpcontents); //Warning: explode() expects parameter 2 to be string
将 $wordsdic=explode("\n",$tmpcontents)改成$wordsdic=explode("\n",$tmpcontents[1])后出错消失,但 数据不对。
我是小白,请多指教,(抱拳)
追答
file的结果就可以使用呀?有什么问题,为什么不用file
explode报错是参数2不是字符串,你把这个变量值是什么,为什么要带如这个变量去作为字符串拆分
再说使用file直接得到数组,不要file_get_contents+explode方法自己做数组,除非自己明白再做什么
追问
function __construct($dic_file='b.txt')  
$tmpcontents=$this->getFileContents($dic_file);
if($tmpcontents)
{
$this->wordsdic=$tmpcontent;
......
function isWords($words)
{
echo '是否存在本词:'.array_search($words,$this->wordsdic).'';
......
追答
getFileContents方法是如何实现的呢,需要自己分析,或者调试一些返回结果$tmpcontents
的类型,我没有看见源码、没有进行调试,无法判断$tmpcontents可以进行哪些下一步的使用。
追问
$tmpcontent形如
Array ( [0] => 啊啊啊 [1] => 阿埃二氏病变 [2] => 阿埃二氏手术
可它没法传到array_search($words,$this->wordsdic)
追答
这样可以吗?array_search($words,$tmpcontent)
追问
一样不行。因为它们属于两个function
function __construct($dic_file='b.txt'){}
function isWords($words){}
追答
不知道楼主有没有想过怎样才得行没有,是不是应该把$tmpcontent存入对象的属性里面呢:
$this->wordsdic = $tmpcontent;