【问题标题】:check for variable existence with isset?用isset检查变量是否存在?
【发布时间】: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-titleno-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
  • 抱歉,问题是输入的换行符。只需将它们修剪掉,它就更有意义了。我已经用新代码更新了答案。

标签: php arrays var isset


【解决方案1】:

您需要修剪从文件中读取的行,因为它们上面有换行符。

我还将所有详细信息存储在“信息”数组中...

    if ($handle = fopen(__DIR__ ."/description.txt", "r")) {
    while (($line = fgets($handle)) !== false) {

        $line = trim($line);
        // process each line and put title & desc into an info array
        $parts = explode('|', $line);

        $fileDetails = array();
        $fileDetails['filename'] = ! empty($parts[0]) ? $parts[0] : 'no-filename';
        $fileDetails['title'] = ! empty($parts[1]) ? $parts[1] : 'no-title';
        $fileDetails['description'] = ! empty($parts[2]) ? $parts[2] : 'no-description';

        $this->info[] = $fileDetails;
    }
    fclose($handle);

【讨论】:

  • 这行得通,但是如果 var_dump 告诉我 $parts[1] 为空,在我只有文件名的情况下,为什么我不能简单地检查空值?
  • @branquito,如果您对数组进行计数,您会发现“爆炸”并不总是提供三个部分。所以你必须使用'isset'或'empty'检查。 array_shift 总是 返回一个结果。当数组中没有更多条目时,它为空。
  • var_dump -ing 很好,但是当我在三元检查中使用 $title 和 $description 变量时,仍然没有得到 no-titleno-description
  • @branquito,你知道数组不是 $part[0]['title']' 吗?如果所有项目都在那里,它将是 $part[0]、$part[1] 和 $part[2]。
  • 不是$part[0]['title'],是info[$part[0]]['title'],那是另一个数组
【解决方案2】:

请查看数组大小function.count

$parts = explode('|', $line);
$this->info[$parts[0]]['title'] = count($parts)==1 : 'no-title';
$this->info[$parts[0]]['description'] = count($parts)==2 : 'no-description';

【讨论】:

  • 如果你正在检查isset(parts[1]) count(parts) 必须是2 我不知道其他方式
【解决方案3】:

检查 - 它有帮助

$parts = explode('|', $line);

$no_title = 'no-title';
if($parts[1]){
  $no_title = $parts[1];
}

$no_description = 'no-description';

if($parts[2]){
  $no_description = $parts[2];
}

$this->info[$parts[0]]['title'] = $no_title;
$this->info[$parts[0]]['description'] = $no_description;

例如

$line =  'filename';

$no_title = 'no-title';
if($parts[1]){
  $no_title = $parts[1];
}

$no_description = 'no-description';

if($parts[2]){
  $no_description = $parts[2];
}

echo $no_title .' ';
echo $no_description;

输出:

no-title no-description 

【讨论】:

  • 这对我来说似乎过于复杂,我想知道为什么我不能用 isset() 检查变量是否存在,如果我只有 $parts[0],就像 var_dump 说的那样,我只想检查 $parts[1] 是否存在,它不存在,所以我很困惑。
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2014-09-08
  • 2015-09-30
  • 2016-12-28
  • 2013-11-13
  • 2017-08-05
  • 2010-10-25
相关资源
最近更新 更多