PHP-消息:未定义索引,但索引存在
我有一个很奇怪的问题。 我有一个小脚本,可以读取.csv文件并将其存储在MySQL数据库中。 上传和读取文件工作正常(这是CodeIgniter的csvreader库)-当我这样做时:PHP-消息:未定义索引,但索引存在,php,arrays,codeigniter,Php,Arrays,Codeigniter,我有一个很奇怪的问题。 我有一个小脚本,可以读取.csv文件并将其存储在MySQL数据库中。 上传和读取文件工作正常(这是CodeIgniter的csvreader库)-当我这样做时: $csvData = $this->csvreader->parse_csv($_FILES['csv_file']['tmp_name']); var_dump($csvData); 我得到了正确的结果: array(62) { [1]=> array(1) { ["
$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);
}
但在这一刻,我得到了一个信息:
严重性:通知消息:未定义索引:电子邮件地址
所以在循环中,var_转储
var_dump($data_from_csv);
给我这个结果:
array(1) { ["email_address"]=> string(29) "info.bucharest@xxx.com" }
整个项目运行在共享主机PHP7.3上,框架为CodeIgniter3
我做错了什么
提前感谢。您正在一个简单的数组上循环,因此var
$data\u from\u csv
将包含电子邮件地址
该错误消息是因为实际上在csv的$data\u中没有出现电子邮件地址
因此,相应地更改此代码
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);
}
如果在一个简单数组上循环,则var$data\u from\u csv
将包含电子邮件地址
该错误消息是因为实际上在csv的$data\u中没有出现电子邮件地址
因此,相应地更改此代码
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);
}
好的,我知道了
在这种情况下发生的事情可能与字符编码有关。。。我想
对于循环中的测试,我添加了一个checkvar_dump(array_key($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);
}
所以。。。现在,我将努力确保用户上传的文件正确编码。
谢谢好的,我拿到了
在这种情况下发生的事情可能与字符编码有关。。。我想
对于循环中的测试,我添加了一个checkvar_dump(array_key($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);
}
所以。。。现在,我将努力确保用户上传的文件正确编码。
谢谢您确定每条记录都有相关的电子邮件地址
?我猜集合中有1个或多个记录实际上缺少该属性。您可以通过在循环中添加以下内容来测试上述理论:if(!isset($data_from_csv['email_address']){var_dump($data_from_csv);}
,如果它对foreach($csvData as$data_from_csv)有帮助的话,看看会有什么结果{$this->add_email_到_a_组($data_from_csv[0]['email_address'],$contact_group_id)}
FWIW,在尝试使用它之前,最好先检查所需的数组索引是否存在,例如:if(isset($data_from_csv['email_address']){//在这里对来自_csv['email_address']的$data_做些什么…
总是会造成混乱,请使用打印_r
,以便获得数组的精确结构。是否确定每个记录都有一个关联的电子邮件地址
?我猜集合中有一个或多个记录实际上缺少该属性您可以通过在循环中添加以下内容来测试上述理论: 如果(!isset($data_from_csv['email_address']){var_dump($data_from_csv);}
,看看会有什么效果,如果它对foreach($csvData as$data_from_csv){$this->将_email_添加到_a_组($data_from_csv[0]['email_address'],$contact_group_id)}有帮助,请尝试一下这个方法
FWIW,在尝试使用它之前,最好先检查是否存在所需的数组索引,方法如下:if(isset($data\u from_csv['email\u address']){//在这里使用$data\u from_csv['email\u address']做点什么…}
总是会造成混乱,请使用打印\u r
以便获得数组的精确结构。谢谢,但我认为这不是解决方案。在我的循环中,我正在检查来自\u csv的$data\u是否是数组:如果(是数组($data\u from\u csv)){print\u r($data\u from\u csv);exit()}
,它会将此变量检测为带有键的数组[电子邮件地址]:数组([电子邮件地址]=>信息。bucharest@als-(europe.com)
这里有点可笑,为什么所有数组转储都从发生时开始1
而不是0
我认为这是csvreader库-此数组的0元素是CVS文档中的“第一个单元格”(从Excel生成)它用来创建一个键。如果我再添加一列,即:公司数组将如下所示:array=['email'=>'email@server“,”公司“=>”公司“]
所以谢谢!那么你绝对确定这是错误识别的行吗?大多数错误都有行号和文件名…但是-我添加了一个额外的循环,使数组从0开始,它仍然是相同的。严重性:注意消息:未定义索引:电子邮件地址文件名:controllers/Contacts.php行号:140 Backtrace:File:/home/myfreightforward/xxxx/application/controllers/Contacts.php
139:foreach($new_array as$data_from_csv){140:$this->add_email_to_a_group($data_from_csv['email_address',$contact_group_id)];
谢谢,但我认为这不是解决方案。在我的循环中,我正在检查$data_from_csv是否是一个数组:if(is_array($data_from_csv)){print_r($data_from_csv);exit();}
,它将此变量检测为一个带有键[email_address]:数组([email_address]=>info)。bucharest@als-欧洲网)
这里有点可笑,为什么所有数组转储都从发生时开始1
而不是0
我认为这是csvreader库-此数组的0元素是CVS文档(从Excel生成)中的“第一个单元格”,用于创建键。如果我添加另一列,即:公司数组将如下所示:array=['email'=>'email@server“,”company'=>”company']
等等,谢谢,那么你确定这是