【发布时间】:2014-06-23 01:29:30
【问题描述】:
好吧,这很奇怪,我一遍又一遍地尝试使用不同的方法,但似乎没有什么能满足我的需要。
我有一个description.txt 文件,其内容格式为:
filename|title|description
现在,对于该文件的每一行,我都会这样做:
$parts = explode('|', $line);
$this->info[$parts[0]]['title'] = isset($parts[1]) ? $parts[1] : 'no-title';
$this->info[$parts[0]]['description'] = isset($parts[2]) ? $parts[2] : 'no-description';
但是,因为我的 description.txt 文件中的某些行没有标题和描述,只有文件名
我认为检查这些缺失部分是否存在就可以了,在这种情况下回显no-title 和no-description
分别。但是上面的代码并没有产生这些字符串,而且我没有看到任何回显。
我也尝试了array_key_exists('1', $parts),但没有成功。尝试使用is_null 没有成功。
我不知道为什么这不起作用。
补充一点,如果没有任何管道分隔的部分丢失,代码可以正常工作,所以这只是如何捕获那些不存在的部分的问题。
在$parts[1] 上执行var_dump,对于文件名后没有任何内容的行给我null
如果第一行仅是文件名,则这是var_dump($parts); die; 的输出:
array (size=1)
0 => string '10172608_1425353644382351_9063428062883749844_n.jpg
' (length=52)
例如第一行:
filename
filename|title|description
我设法使它与!empty($parts[1]) 检查一起工作,但我必须在我的description.txt 文件中:
filename||| 让它工作,当我没有标题或描述时,我想跳过那些额外的管道。
这是整个循环:
如果description.txt 文件如下:
filename|||
对于不包含标题或描述的行。
if($handle = @fopen($this->path . "/" . $this->desc_file, "r")) {
while (($line = fgets($handle)) !== false) {
// process each line and put title & desc into an info array
$parts = explode('|', $line);
$this->info[$parts[0]]['title'] = ! empty($parts[1]) ? $parts[1] : 'no-title';
$this->info[$parts[0]]['description'] = ! empty($parts[2]) ? $parts[2] : 'no-description';
}
}
【问题讨论】:
-
您是否尝试打印您的
$parts以查看里面有什么? -
@ThiagoFrança 查看我对 var_dump 输出的编辑
-
用循环粘贴整个代码。
-
我没有看到代码错误...只是为了测试,将
$line = fgets...更改为$line = fgetcsv($handle, 0, '|')。fgetcsv返回一个数组,您不需要使用explode。 -
抱歉,问题是输入的换行符。只需将它们修剪掉,它就更有意义了。我已经用新代码更新了答案。