PHP: Undefined index even if it exists

后端 未结 6 769
难免孤独
难免孤独 2021-01-18 03:22

It drives me crazy ... I try to parse a csv file and there is a very strange behavior.

Here is the csv

action;id;nom;sites;heures;jours
i;;\"un nom a         


        
相关标签:
6条回答
  • 2021-01-18 03:34

    If your CSV file is in UTF-8 encoding,

    make sure that it's UTF-8 and not UTF-8-BOM.

    (you can check that in Notepad++, Encoding menu)

    0 讨论(0)
  • 2021-01-18 03:35

    I struggled with this issue until I realised that my chunk of code has been run twice.

    First run when index was present and my array was printed out properly, and the second run when index was not present and the notice error is triggered. That left me wondering "why my obviously existing and properly printed out array is triggering an 'Undefined index' notice". :)

    Maybe this will help somebody.

    0 讨论(0)
  • 2021-01-18 03:39

    Sorry I am posting on an old thread, but thought my answer could add to ones already provided here...

    I'm working with a Vagrant guest VM (Ubuntu 16.04) from a Windows 10 host. When I first came across this bug (in my case, seeding a database table using Laravel and a csv file), @ojovirtual's answer immediately made sense, since there can be formatting issues between Windows and Linux.

    @ojovirtual's answer didn't quite work for me, so I ended up doing touch new_csv_file.csv through Bash, and pasting contents from the 'problematic' CSV file (which was originally created on my Windows 10 host) into this newly-created one. This definitely fixed my issues - it would have been good to learn and debug some more, but I just wanted to get my particular task completed.

    0 讨论(0)
  • 2021-01-18 03:48

    I had the same problem with CSV files generated in MS Excel using UTF-8 encoding. Adding the following code to where you read the CSV solves the issue:

    $handle = fopen($file, 'r');
    
    // ...
    
    $bom = pack('CCC', 0xef, 0xbb, 0xbf);
    
    if (0 !== strcmp(fread($handle, 3), $bom)) {
        fseek($handle, 0);
    }
    // ...
    

    What it does, is checking for the presence of UTF-8 byte order mark. If there is one, we move the pointer past BOM. This is not a generic solution since there are other types BOMs, but you can adjust it as needed.

    0 讨论(0)
  • 2021-01-18 03:55

    Probably there is some special character at the beginning of the first line and trim isn't removing it.

    Try to remove every non-word character this way:

    // Identify headers
    if(!isset($headers))
    {
        for($i=0;$i<$cols;$i++)
        {
            $headers[preg_replace("/[^\w\d]/","",strtolower($row[$i]))] = $i;
    ....
    
    0 讨论(0)
  • 2021-01-18 03:57

    I struggled with this issue for a few hours only to realize that the issue was being caused by a null key in the array. Please ensure that none of the keys has a null value.

    0 讨论(0)
提交回复
热议问题