数组中未定义的索引,但它在那里

Undefined index in array but it is there

我有一个名为 $csv 的数组。 header 列包含在 $csv[0] 中。我有一个循环进入并覆盖 $csv 数组中从索引 1 开始的一些数据。

出于某种原因,当我尝试输出 $csv[1]['CRM ID'] 时它不再获得任何值,即使当我执行 $csv[1]var_export 时该值仍然存在。

能够从$csv[1]['Agency']读取数据就好了。与space有关吗?它一直工作到现在,直到更改了一段看似无关的第 3 方代码。

// Agency ID - prefix + zerofill
$agency_id_n = strpos($csv[$i]['Agency'], 'A') === 0 ? (int) ltrim($csv[$i]['Agency'], 'A') : (int) $csv[$i]['Agency'];
$csv[$i]['Agency'] = $agency_id_p = 'A' . str_pad($agency_id_n, 5, '0', STR_PAD_LEFT);

// CRM ID - prefix + zerofill
echo "<h1>$csv :-</h1><pre>" . print_r($csv, true) . "</pre>";
echo "<h1>$csv[1] :-</h1><pre>" . var_export($csv[1], true) . "</pre>";
echo "<h1>yyyyy = {$csv[1]['CRM ID']} / " . var_export($csv[1]['CRM ID'], true) . "</h1>";

$crm_id_n = strpos($csv[$i]['CRM ID'], 'C') === 0 ? (int) ltrim($csv[$i]['CRM ID'], 'C') : (int) $csv[$i]['CRM ID'];

echo "<h1>has c = " . (strpos($csv[$i]['CRM ID'], 'C') === 0 ? 'yes' : 'no') . "</h1>";
echo "<h1>val = {$csv[$i]['CRM ID']}</h1>";
echo "<h1>y = $crm_id_n</h1>";
die("<h1>csv...</h1><pre>" . print_r($csv, true) . "</pre>");

罪魁祸首是 fgetcsv 容易受到字节顺序标记 (BOM) 的影响 - 来自对 PHP 手册的评论:

This function has no special BOM handling. The first cell of the first row will inherit the BOM bytes, i.e. will be 3 bytes longer than expected. As the BOM is invisible you may not notice.

Excel on Windows, or text editors like Notepad, may add the BOM.