【问题标题】:PHP foreach and explode array code not functioning properlyPHP foreach 和爆炸数组代码无法正常运行
【发布时间】:2014-09-24 03:25:45
【问题描述】:
<?php
$string = file_get_contents("csv.csv");
$array = explode(",", $string);
$q = strtolower($_GET[q]);
foreach ($array as $value) {
    $result = explode(":", $value);
if (strpos($q, $result[0]) !== false) {
    $output = $result[1];
}
}

echo $output;
?>

这是文件csv.csv 的内容,我将其转换为字符串。

hello: how are you doing,
hi: what are you,
df:df

如果$_GET[q](和$q)是hello,则$output 是how are you doing。但是,如果是hi,我不会得到输出what are you,或者如果我是df,我不会得到df。

发生这种情况的任何原因?提前感谢您的热心帮助。

【问题讨论】:

  • $_GET[q] 应该是$_GET['q']。
  • 确保开启 error_reporting 和 display_errors,始终处于开发阶段。 PHP 将在$_GET[q] 中抱怨undefined constant q。 error_reporting(E_ALL); ini_set('display_errors', 1);总是在开发代码时.
  • @Darren 从纯语法的角度来看很好,但实际上我已经不知疲倦地使用了$_GET[q],它与$_GET['q'] 没有什么不同。另外,我确定它与发生的问题无关......
  • @MichaelBerkowski 错误报告是开启。
  • @testo 但它是不同的。我使 PHP 使用一种旨在使您摆脱自己的行为,从而将它不知道的常量转换为字符串。依赖是一件坏事。如果您的错误报告显示为E_ALL(不禁止通知),您肯定会看到类似使用未定义常量 q - 假定为 'q' 的通知

标签: php arrays csv explode


【解决方案1】:

你用逗号爆炸,但事实是你有每个值用逗号加换行符分隔。

爆炸后,你的数组是 ["hello","\nhi...","\ndf:..."],这就是 strpos 比较不匹配的原因。

试试

$array = explode(",\n", $string);

编辑:正如@Michael Berkowski 所说,您也可以修剪参数

if (strpos($q, trim($result[0])) !== false)

参数的顺序取决于你想提供什么样的部分匹配。根据您当前的参数顺序,参数“hi”将匹配“hi”、“h”和“i”,但不匹配“high”。

如果你按照迈克尔的建议翻转它们,参数“hi”将匹配“hi”和“high”,但不匹配“h”或“i”。

【讨论】:

  • 为了澄清出了什么问题,strpos() 的 args 是 $haystack, $needle,因此您正在搜索 $q 其值为 'hi' 的文字字符串 'hi\n' 并且不匹配.如果您改为翻转 args strpos($result[0], $q),它将匹配,但解决方案是在 explode 或更高版本中使用 trim() 修剪换行符。
  • 手动解析 CSV 很丑,会导致这个问题,你应该使用str_getcsv,因为它会自动处理这个问题
  • 我使用fgetcsv,唯一需要注意的是检查设置auto_detect_line_endings
【解决方案2】:

使用str_getcsv代替手动解析CSV

使用 str_getcsv 并将 $_GET[q] 替换为 $_GET['q'] 可以解决问题

    $csv = file_get_contents('csv.csv');
    $array = str_getcsv($csv);
    var_dump($array);
    $q = $_GET['q'];
    foreach ($array as $value) {
        $result = explode(":", $value);
        if (strpos($q, $result[0]) !== false) {
            $output = $result[1];
        }
    }

    echo $output;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多