【问题标题】:PHP foreach Loop data type complications and value retrievalPHP foreach 循环数据类型复杂性和值检索
【发布时间】: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


【解决方案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

【讨论】:

  • 返回这个数组(3) { [0]=> int(0) [1]=> int(0) [2]=> int(0) }
  • 开关是否以 === 方式比较数据类型?
  • 修复了它。它现在应该返回类似于 ['partnumber' = 0,'description' => 1 ,'listprice' => 2] 的内容
  • @OverBakedToast no , switch 类似于 if($something == $something_else)
  • 是的,它返回了 array(3) { ["partnumber"]=> int(0) ["description"]=> int(1) ["listprice"]=> int(2) }但我不明白为什么它仍然不能与开关一起使用。感谢您提出解决方案!这只是意味着知道为什么开关不起作用是额外的功劳;)
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多