我试图将数据从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或falsey意义上是0吗?
if(!$value) {
echo " I'm False or Null. ";
}
但是Print没有变化:
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;
这将返回任何结果。
任何,建议?
此Scinario感谢@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:
另一个奇怪的scinario:
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:
答案 0 :(得分:1)
将所有值转换为integer
,然后使用$csv
数组。
$csv = [];
foreach (fgetcsv($openItems) as $key => $value) {
$csv[$value] = (Int) $key;
}
var_dump($csv);
注意==和===不一样!
<?php
$a = 0;
$b = "0";
// == is the Equal Comparison Operator
//if $a is equal to $b after type juggling.
if($a == $b) {
echo "YES ITS TRUE";
}
// === is the Identical Comparison Operator
// if $a is equal to $b, and they are of the same type.
if($a === $b) {
echo "Is it ?";
} else {
echo "well its not";
}
您可以在此处详细了解比较运算符:http://php.net/manual/en/language.operators.comparison.php