PHP foreach循环数据类型和值检索

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

我试图从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
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)}但我不明白为什么开关仍然不能工作。谢谢你提出了一个解决方案!!!这仅仅意味着知道开关为什么不工作是额外的学分;)