我有一个问题,我无法解释自己。我认为这可能是PHP或Laravel的错误 - 或者我正在做一些我不应该做的事情。
我有一个包含国家/地区代码和国家/地区名称的.csv文件
我想读取文件并使用数据为我的数据库播种。 因此,我有以下代码将CSV转换为数组:
$csv = public_path() . "/assets/countries.csv";
if(File::exists($csv)) {
$content = File::get($csv);
$lines = array();
$lines = explode("\n", $content);
for($i=0; $i<sizeof($lines);$i++) {
$line = $lines[$i];
$line = explode(",",$line);
$lines[$i] = $line;
}
}
到目前为止,我的$ lines数组现在具有所有值,每个值都是一个包含2个索引的数组,0代表代码,1代表国家/地区名称。
做foreach($ lines as $ line)和var dumping $ line,我得到:
array(2) { [0]=> string(2) "AF" [1]=> string(12) "Afghanistan " }
.....
每个条目。但现在发生了以下情况:
echo $line[0]; // output: AF
echo $line[1]; // undefined offset 1 error
我试图检查1是否是字符串索引或者是什么,请参阅以下代码+输出:
foreach($lines as $line) {
var_dump($line);
echo 'array_key_exists(1, $line): ';
var_dump(array_key_exists(1, $line));
foreach($line as $key => $col) {
echo 'var_dump($key): ';
var_dump($key);
echo '$col: ' . $col;
echo '$line[$key]: ' . $line[$key];
}
}
(为了便于阅读,我删除了一些回显的中断) 代码产生以下输出(对于第一个结果,对于所有其他结果类似):
array(2) { [0]=> string(2) "AF" [1]=> string(12) "Afghanistan " }
array_key_exists(1, $line): bool(true)
var_dump($key): int(0)
$col: AF
$line[$key]: AFvar_dump($key): int(1)
$col: Afghanistan
$line[$key]: Afghanistan
array_key_exists(1, $line)
如何导致true,但$line[1]
在未定义的偏移中:1错误?谢谢你的帮助。
编辑:$line[$key]
正在运行,而$line[1]
则没有。在这种情况下,var_dump(1 == $ key)会导致bool(true)...
EDIT2:如果我使用相同的代码而不使用laravel(然后是file_get_contents) - 我没有收到错误。见this fiddle for the code
答案 0 :(得分:1)
.csv文件中有一个空的最后一行。该文件无法展开,导致$lines[249]
(最后一个条目)中只有一个值。
我的借口。