PHP foreach循环数据类型的复杂性和值检索

时间:2017-12-06 20:54:44

标签: 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 => $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: 

1 个答案:

答案 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