Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:未定义的索引,即使它存在_Php - Fatal编程技术网

PHP:未定义的索引,即使它存在

PHP:未定义的索引,即使它存在,php,Php,它让我发疯。。。我试图解析一个csv文件,但有一个非常奇怪的行为 这是csv action;id;nom;sites;heures;jours i;;"un nom a la con";1200|128;;1|1|1|1|1|1|1 现在是php代码 $required_fields = array('id','nom','sites','heures','jours'); if (($handle = fopen($filename, "r")) !== FALSE) { $cols

它让我发疯。。。我试图解析一个csv文件,但有一个非常奇怪的行为

这是csv

action;id;nom;sites;heures;jours
i;;"un nom a la con";1200|128;;1|1|1|1|1|1|1
现在是php代码

$required_fields = array('id','nom','sites','heures','jours');
if (($handle = fopen($filename, "r")) !== FALSE)
{
    $cols = 0;
    while (($row = fgetcsv($handle, 1000, ";")) !== FALSE)
    {
        $row = array_map('trim',$row);
        // Identify headers
        if(!isset($headers))
        {
            $cols = count($row);
            for($i=0;$i<$cols;$i++) $headers[strtolower($row[$i])] = $i;
            foreach($required_fields as $val) if(!isset($headers[$val])) break 2;
            $headers = array_flip($headers);
            print_r($headers);
        }
        elseif(count($row) >= 4)
        {
            $temp = array();
            for($i=0;$i<$cols;$i++)
            {
                if(isset($headers[$i]))
                {
                    $temp[$headers[$i]] = $row[$i];
                }
            }
            print_r($temp);
            print_r($temp['action']);
            var_dump(array_key_exists('action',$temp));
            die();
        }
    }
}

第一行开头可能有一些特殊字符,
trim
没有删除它

尝试通过以下方式删除每个非单词字符:

// Identify headers
if(!isset($headers))
{
    for($i=0;$i<$cols;$i++)
    {
        $headers[preg_replace("/[^\w\d]/","",strtolower($row[$i]))] = $i;
....
//标识头
如果(!isset($headers))
{

对于($i=0;$i很抱歉,我发布了一个旧的帖子,但我认为我的答案可以添加到这里已经提供的帖子中

我使用的是一个来自Windows 10主机的流浪客虚拟机(Ubuntu 16.04)。当我第一次遇到这个错误时(在我的例子中,使用Laravel和csv文件创建数据库表),@ojovirtual的回答立刻就有了意义,因为Windows和Linux之间可能存在格式问题


@ojovirtual的答案对我来说不太合适,所以我最终通过Bash做了
touch new_csv_file.csv
,并粘贴了“有问题的”csv文件(最初是在我的Windows 10主机上创建的)中的内容这肯定解决了我的问题-学习和调试更多的东西会很好,但我只是想完成我的特定任务。

我为这个问题挣扎了几个小时,才意识到问题是由数组中的空键引起的。请确保没有任何键具有空值ue.

如果您的CSV文件采用UTF-8编码

确保它是UTF-8而不是UTF-8-BOM


(您可以在记事本++的“编码”菜单中进行检查)

我在MS Excel中使用UTF-8编码生成的CSV文件中遇到了相同的问题。将以下代码添加到您读取CSV的位置可以解决此问题:

$handle = fopen($file, 'r');

// ...

$bom = pack('CCC', 0xef, 0xbb, 0xbf);

if (0 !== strcmp(fread($handle, 3), $bom)) {
    fseek($handle, 0);
}
// ...

它所做的是检查UTF-8是否存在。如果存在,我们将指针移过BOM。这不是通用解决方案,因为还有其他类型的BOM,但您可以根据需要调整它。

我一直在努力解决这个问题,直到我意识到我的代码块已经运行了两次

第一次运行是在索引存在且正确打印数组时,第二次运行是在索引不存在且触发通知错误时。这让我想知道“为什么我明显存在且正确打印的数组会触发“未定义索引”通知”。)


也许这会对某些人有所帮助。

在哪里设置$headers?为什么
打印($temp['action'])
$temp['action']
不是数组吗?这可能不会对您有多大帮助,但我只是自己测试了它,根本没有问题;密钥存在。我也尝试了您的代码,也没有出现错误,我可以回显$temp['action']的值;您确定您的CSV与POST相同吗?字符串“action”开头可能有额外的“control”字符。我建议使用bin2hex显示数组键,以查看构成“action”数组键的确切字符。提示是,当您向输入行添加额外列时,“action”一词就可以了。您可以还可以“修剪”单词,因为这样也可以删除空白。
// Identify headers
if(!isset($headers))
{
    for($i=0;$i<$cols;$i++)
    {
        $headers[preg_replace("/[^\w\d]/","",strtolower($row[$i]))] = $i;
....
$handle = fopen($file, 'r');

// ...

$bom = pack('CCC', 0xef, 0xbb, 0xbf);

if (0 !== strcmp(fread($handle, 3), $bom)) {
    fseek($handle, 0);
}
// ...