PHP foreach循环数据类型和值检索
我试图从foreach循环中提取数据,但遇到了一个我还没有遇到的奇怪现象 CSV的第一行如下所示:PHP foreach循环数据类型和值检索,php,foreach,switch-statement,Php,Foreach,Switch Statement,我试图从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 => $val
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
partnumber = 0 I'm 0. description = 1 I'm 0. listprice = 2 I'm 0.
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 description = 1 listprice = 2
pn: des: 1 lp: 2
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
partnumber = 0 description = 1 listprice = 2
pn: des: 1 lp: 2
这意味着它在空或错误意义上是0,对吗
if(!$value) {
echo " I'm False or Null. ";
}
但打印内容不变:
partnumber = 0 description = 1 listprice = 2
pn: des: 1 lp: 2
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:
将所有值转换为
整数
,然后使用$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";
}
csv中零件号的格式是什么?我对您的代码感到困惑。是否将每个都分配给它们的索引位置,而不是它们的实际值?请再添加几行csv文件。@Krish它在csv文件中,所以我的假设是partnumber是纯文本OK,我想我明白了。第一次抓取只是处理文件中的第一个csv行,以设置索引是什么。因此,您发现了一个奇怪的问题,$key不能转换成$pn。嗯。奇怪的一个…当你做这个测试时,如果($value==0){echo“I'm 0”}
。。。是因为。。。另外,由于if(is_numeric($value))
返回的结果是正确的(那些字符串不是数字),而且if(!$value)
返回的结果也是正确的$值确实包含您期望的字符串。这将返回此数组(3){[0]=>int(0)[1]=>int(0)[2]=>int(0)}开关是否以===方式比较数据类型?已修复。它将返回类似于['partnumber'=0,'description'=>1,'listprice'=>2]的内容now@OverBakedToast不,开关类似于if($something==$something\u else)是的,它返回数组(3){[“partnumber”]=>int(0)[“description”]=>int(1)[“listprice”]=>int(2)}但我不明白为什么开关仍然不能工作。谢谢你提出了一个解决方案!!!这仅仅意味着知道开关为什么不工作是额外的学分;)