【发布时间】:2017-12-06 20:54:44
【问题描述】:
我试图从 foreach 循环中提取数据,但我遇到了一个我还没有遇到过的奇怪现象。
CSV 的第一行如下所示:
Part Number,Description,List Price
然后是数据等等。
我有什么:
ini_set('auto_detect_line_endings', TRUE);
if (($openItems = fopen($uploadFile, 'r')) !== FALSE) {
foreach (fgetcsv($openItems) as $key => $value) {
$value = preg_replace('/\h+/', '', strtolower($value));
echo $value;
echo ' = ' . $key . " ";
switch ($value) {
case "partnumber":
$pn = $key;
break;
case "description":
$des = $key;
break;
case "listprice":
$lp = $key;
break;
}
}
print_r("\npn: " . $pn . " des: " . $des . " lp: " . $lp);
}
打印:
partnumber = 0 description = 1 listprice = 2
pn: des: 1 lp: 2
如您所见,第一列是错误的,因此未为其分配正确的值。
替代打印:
test = 0 partnumber = 1 description = 2 listprice = 3
pn: 1 des: 2 lp: 3
在 $key 被回显后,我还尝试了一个练习:
if($value == 0) {
echo " I'm 0 ";
}
打印:
partnumber = 0 I'm 0. description = 1 I'm 0. listprice = 2 I'm 0.
pn: des: 1 lp: 2
但如果你检查算术,它会返回错误:
if(is_numeric($value)) {
echo " I'm a number. ";
}
打印不变:
partnumber = 0 description = 1 listprice = 2
pn: des: 1 lp: 2
这意味着它在 NULL 或错误意义上是 0 对吧?
if(!$value) {
echo " I'm False or Null. ";
}
但打印没有改变:
partnumber = 0 description = 1 listprice = 2
pn: des: 1 lp: 2
类型检查:
echo "I'm of Type ". gettype($value) . ". ";
返回:
partnumber = 0 I'm of Type string. description = 1 I'm of Type string. listprice = 2 I'm of Type string.
旁注:
case "partnumber":
$pn = $key;
break;
从未访问过
case "partnumber":
$pn = $key;
echo "I Worked!";
break;
返回没有任何结果。
有什么建议吗?
感谢@azjezz
$csv = [];
ini_set('auto_detect_line_endings', TRUE);
if (($openItems = fopen($uploadFile, 'r')) !== FALSE) {
foreach (fgetcsv($openItems) as $key => $value) {
$value = preg_replace('/\h+/', '', strtolower($value));
$csv[$value] = (Int) $key;
echo $value;
echo ' = ' . $key . " ";
switch ($csv[$value]) {
case "partnumber":
$pn = $key;
break;
case "description":
$des = $key;
break;
case "listprice":
$lp = $key;
break;
}
}
print_r("\npn: " . $pn . " des: " . $des . " lp: " . $lp);
}
结果:
partnumber = 0 description = 1 listprice = 2
pn: 0 des: lp:
另一个奇怪的场景:
switch ((int) $value) {
case "partnumber":
$pn = $key;
break;
case "description":
$des = $key;
break;
case "listprice":
$lp = $key;
break;
}
返回:
partnumber = 0 description = 1 listprice = 2
pn: 2 des: lp:
【问题讨论】:
-
csv中partnumber的格式是什么?
-
我对那里的代码感到困惑。您将每个分配给他们的索引位置,而不是他们的实际价值?请再添加几行 csv 文件。
-
@Krish 它在一个 csv 文件中,所以我的假设是部件号是纯文本
-
好的,我想我跟着。第一次抓取只是处理文件中的第一个 csv 行,以设置索引是什么。因此,您会发现一个奇怪的问题,即 $key 根本不会转移到 $pn。唔。好奇的...
-
当您进行此测试时
if($value == 0) { echo " I'm 0 "; }... 是因为:stackoverflow.com/questions/6843030/… ... 也因为if(is_numeric($value))返回正确(这些字符串不是数字),并且if(!$value)也返回正确... $value 确实包含您期望的那些字符串。
标签: php foreach switch-statement