【问题标题】:PHP - Message: Undefined index but index existsPHP - 消息:未定义索引但索引存在
【发布时间】:2020-06-18 01:19:54
【问题描述】:

我遇到了一个非常奇怪的问题。 我有一个读取 .csv 文件并将其存储在 MySQL 数据库中的小脚本。 上传和读取文件工作正常(这是 CodeIgniter 的 csvreader 库) - 当我这样做时:

$csvData = $this->csvreader->parse_csv($_FILES['csv_file']['tmp_name']);
   var_dump($csvData);

我得到了正确的结果:

array(62) {
  [1]=>
  array(1) {
    ["email_address"]=>
    string(29) "info.bucharest@xxx.com"
  }
  [2]=>
  array(1) {
    ["email_address"]=>
    string(28) "cristina.banu@xxx.com"
  }
  [3]=>
  array(1) {
    ["email_address"]=>
    string(24) "office-ro@gxxx.com"
  }

接下来我要做的就是循环遍历

 foreach($csvData as $data_from_csv){
  $this->add_email_to_a_group($data_from_csv['email_address'], $contact_group_id);
 }

但此刻我收到消息:

严重性:通知消息:未定义索引:email_address

所以在循环中 var_dumping

var_dump($data_from_csv);

给我这个结果:

array(1) { ["email_address"]=> string(29) "info.bucharest@xxx.com" }

整个项目在共享主机 PHP 7.3 上运行,框架是 CodeIgniter3。

我做错了什么?

提前致谢。

【问题讨论】:

  • 您确定每条记录都有关联的email_address吗?我猜该集中有 1 条或多条记录实际上缺少该属性
  • 您可以通过在循环中添加以下内容来测试上述理论:if (!isset($data_from_csv['email_address'])) { var_dump($data_from_csv);} 看看会吐出什么
  • 如果有帮助就试试这个foreach($csvData as $data_from_csv){ $this->add_email_to_a_group($data_from_csv[0]['email_address'], $contact_group_id); }
  • FWIW,在尝试通过以下方式使用它之前,最好检查是否存在所需的数组索引:if (isset($data_from_csv['email_address'])) { // do something with $data_from_csv['email_address'] here ... ;}
  • var_dump() 总是会造成混乱,请使用 print_r 以便获得数组的确切结构。

标签: php arrays codeigniter


【解决方案1】:

您正在循环一个简单的数组,因此 var $data_from_csv 将包含电子邮件地址。

错误信息是因为$data_from_csv中实际上没有出现email_address

所以相应地更改此代码

foreach($csvData as $data_from_csv){
    $this->add_email_to_a_group($data_from_csv, $contact_group_id);
}

或者更好的是,给变量命名,这样发生的事情就更清楚了

foreach($csvData as $email){
    $this->add_email_to_a_group($email, $contact_group_id);
}

【讨论】:

  • 谢谢,但我认为这不是解决方案。在我的循环中,我正在检查 $data_from_csv 是否是一个数组:if(is_array($data_from_csv)){print_r($data_from_csv);exit();} 并将此变量检测为带有键 [email_address] 的数组:Array ( [email_address] => info.bucharest@als-europe.com )
  • 这里有点有趣,为什么你所有的数组转储都是从1而不是0开始的
  • 我认为这是 csvreader 库 - 此数组的 0 元素是 CVS 文档(从 Excel 生成)中的“第一个单元格”,用于创建密钥。如果我要添加另一列,即:公司数组看起来像:array = ['email'=>'email@server', 'company'=>'company'] 等等,谢谢
  • 好的,您确定这是错误标识的行吗?大多数错误都带有行号和文件名
  • ... 但是 - 我添加了一个额外的循环来让数组从 0 开始,它仍然是一样的。 Severity: Notice Message: Undefined index: email_address Filename: controllers/Contacts.php Line Number: 140 Backtrace: File: /home/myfreightforward/xxxx/application/controllers/Contacts.php139: foreach($new_array as $data_from_csv){ 140: $this->add_email_to_a_group($data_from_csv['email_address'], $contact_group_id);
【解决方案2】:

好的,我知道了。

在这种情况下发生的事情可能与字符编码有关......我认为。

对于我循环中的测试,我添加了一个检查 var_dump(array_keys($data_from_csv));,它显示“电子邮件”由 8 个字符而不是 5 个字符组成

foreach($csvData as $data_from_csv){
   var_dump(array_keys($data_from_csv)); 
// this was returnig (int)8 rather than expected (int)5 
   $this->add_email_to_a_group($data_from_csv['email'], $contact_group_id);
}

所以...现在我将努力确保用户上传的文件被正确编码。 谢谢

【讨论】:

    猜你喜欢
    • 2019-07-08
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    相关资源
    最近更新 更多