【问题标题】:PHP in_array() always returning falsePHP in_array() 总是返回 false
【发布时间】:2012-07-16 20:24:16
【问题描述】:

当我使用 in_array() 时 PHP 总是返回 false,它是否在数组中并不重要。例如:

$list = 'test
list
example';
$list_arr = array();
$list_arr = explode("\n",$list);
if (in_array('test',$list_arr)) {
    echo 'Found';
}
else {
    echo 'Not Found';
}

即使 'test' 是数组中的一个值,也会返回 'Not Found'

$list = 'test
list
example';
$list_arr = array();
$list_arr = explode("\n",$list);
if (in_array('qwerty',$list_arr)) {
    echo 'Found';
}
else {
    echo 'Not Found';
}

应该返回“未找到”

为什么它应该为真却返回假?请提出任何建议。我实际使用的列表有超过 10K 的值,因此我在这里缩短了它。

【问题讨论】:

  • 您使用的是什么操作系统?在 Windows 中,行尾实际上是两个字符:\r\n,因此将其拆分为 \n 会得到 'text\r'、'list\r' 和 'example'。
  • 你确定你有一个\n 而不是\r\n
  • 你能var_dump($list_arr); 并发布输出吗?

标签: php arrays


【解决方案1】:

如果您正在使用这个确切的示例并在 Windows PC 上进行编码,那么问题出在 Windows 使用以下方式存储换行符这一事实:

\r\n

因此,当您在 \n 上拆分时,您只会在项目末尾保留一个不可见的 \r,因此它们不匹配。

【讨论】:

  • 我在 linux 上,但这确实解决了问题
  • 可以在编辑器中配置,不应该是记事本
  • 我也用 Windows 来编写代码,它只是在 linux 服务器上运行。这可能是为什么?
  • 我糊涂了,你刚才不是说你用的是linux吗?如果您使用 notepad++,请将其配置为将换行符保存为 '\n' (UNIX)。见stackoverflow.com/questions/8195839/…
  • 正如 Esailija 所说,如果你想在 Linux 上使用 PHP_EOL,你的文件源必须以 Linux 格式编码。但如果您的服务器在 Windows 上运行,请确保您的 NotePad++ 配置为 Windows 样式的行尾。
【解决方案2】:

您的列表实际上是由\r\n 分隔的,而不仅仅是\n

$list_arr = explode("\r\n",$list);

【讨论】:

  • 以什么... 4秒击败我?
  • 对,当你用 "\r" 分隔时,你最终会得到 "text\r" 作为字符串 - 所以试着把它放在 in_array() 中看看。
  • @MathieuDumoulin:我是忍者:P
  • 不,你是@Rocket,速度更快!
  • @MathieuDumoulin:火箭忍者。
【解决方案3】:

这是一种将值放入列表的非常奇怪的方式。因此,我假设您最终尝试将单独文件中的行放入数组中。在这种情况下,你会这样做

file('path/to/file');

将每一行读入一个单独的数组项。

引用的文件如下所示:

test
list
example

如果您事先知道代码示例中的值,则应该将它们放入数组中,而不是从字符串中读取它们。

如果您只是必须从字符串中读取值,我建议您使用 PHP_EOL 常量来定义您的换行符。像这样:

$list = 'test' . PHP_EOL . 'list' . PHP_EOL . 'example';
$list_arr = explode(PHP_EOL, $list);

PHP_EOL 常量将为您提供一种更好的独立于平台的方式来获取定义换行符的值。

【讨论】:

    【解决方案4】:

    如前所述,Windows 使用 \r\n 作为行尾字符。 Unix 使用\n,Mac 使用\r。要制作可移植的代码,请使用 PHP_EOL 常量来分解您的字符串:

    $list_arr = explode(PHP_EOL, $list)
    

    这样,您可以确定它始终正常工作。

    【讨论】:

    • 不正确,因为 Windows 会将 EOL 存储为 \r\n 但如果您在 linux pc 上运行它,它将仅是 \n:ca3.php.net/manual/en/reserved.constants.php
    • @MathieuDumoulin 提供的链接没有说明这一点。它只是说平台的“正确的行尾字符”。如果您在 Unix 平台上使用 Windows 终止的编辑器,我的解决方案将无法工作。
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 2013-08-13
    • 2020-12-27
    • 2014-08-26
    • 2012-08-23
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多