【问题标题】:Undefined offset using list()使用 list() 未定义的偏移量
【发布时间】:2014-02-07 23:32:32
【问题描述】:

我正在使用 SplFileObject 解析一个大型 CSV 文件。此 CSV 有近 100,000 条记录和多列。

其中一些列是空的。

我有以下代码:

$file = new SplFileObject($uploadedFile);

$file->setFlags(SplFileObject::READ_CSV);

// ignore the header
$it = new LimitIterator($file, 1);

foreach ($it as $row) {
    list(
        $email,
        $name) = $row;
}

当我运行脚本时,总是报错:

PHP 注意:未定义的偏移量:第 5 行 script.php 中的 1

PHP 注意:未定义的偏移量:第 5 行 script.php 中的 2

    ............

PHP 注意:未定义的偏移量:第 5 行 script.php 中的 35

第 5 行是实际的list() = $row

有什么办法可以解决这个问题吗?也许通过检查数组是否有值?

谢谢

【问题讨论】:

    标签: php splfileobject


    【解决方案1】:

    我会通过手动检查数据是否存在来做到这一点

    foreach ($it as $row) {
        if(isset($row[0])) {
            $email = $row[0];
        } else {
            // if you want to handle case where email is not present, just do something here
        }
        if(isset($row[1])) {
           $name = $row[1];
        }
    
        // now here you have $email and $name set to values from the array.
    }
    

    例如,如果您有数字索引。

    这将使您能够更严格地控​​制将要解析的格式,并且在出现问题时,可以更快地调试缺少确切值的位置或以其他方式遵循逻辑。

    【讨论】:

    • 我是否必须为每个字段都这样做?
    • 您是否有数字索引,或者需要使用$row["nya"] 之类的内容进行访问?您是否知道存在的索引,或者它们是否发生了变化?
    • list() 不创建数字索引吗?
    • 另外,我如何检查list() 内部?
    • 不,list() 是一个自动扩展数组值的函数。它从数组中获取第一个、第二个等元素,并将它们放入您提供的变量中。它是我的方式的简写,但它不做任何检查值是否真的存在,所以如果需要更多控制,它不是合适的工具(我想我过去两年用过一次或两次)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2013-08-18
    • 2011-03-13
    • 1970-01-01
    • 2022-01-02
    • 2013-01-25
    相关资源
    最近更新 更多