Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在_数组中只查找最后一个数组元素_Php_Arrays_Explode_Multiline - Fatal编程技术网

PHP在_数组中只查找最后一个数组元素

PHP在_数组中只查找最后一个数组元素,php,arrays,explode,multiline,Php,Arrays,Explode,Multiline,下面的PHP代码将多行字符串分解为数组。然后使用三个if语句检查数组中是否存在特定的行,如果存在任何行,则回显相应的文本 $multiline_string = 'First line Second line Third line'; $array = explode("\n", $multiline_string); if (in_array('First line', $array)) { echo 'First line exists.'; } if (in_array('S

下面的PHP代码将多行字符串分解为数组。然后使用三个
if
语句检查数组中是否存在特定的行,如果存在任何行,则回显相应的文本

$multiline_string = 'First line
Second line
Third line';

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

if (in_array('First line', $array))
{
    echo 'First line exists.';
}

if (in_array('Second line', $array))
{
    echo 'Second line exists.';
}

if (in_array('Third line', $array))
{
    echo 'Third line exists.';
}
问题是只有
第三行存在。
被回送,这意味着在数组中找不到第一行和第二行

但是我使用
print\r($array)
进行了调试,得到了以下输出:

Array
(
    [0] => First line
    [1] => Second line
    [2] => Third line
)

所以第一行和第二行确实存在于数组中。为什么数组中的
函数找不到它们?

试试
preg\u split
。它允许您使用正则表达式而不是精确的字符串匹配

$multiline_string = 'First line
Second line
Third line';

$array = preg_split("/\r?\n/", $multiline_string);

if (in_array('First line', $array))
{
    echo 'First line exists.';
}

if (in_array('Second line', $array))
{
    echo 'Second line exists.';
}

if (in_array('Third line', $array))
{
    echo 'Third line exists.';
}

如果使用双引号而不是单引号并添加回车符,\r,它将打印出三行(请注意,我们没有为第三行添加回车符)

背景 要了解发生了什么,您需要了解关于如何在文本文件中表示行尾有多种约定

  • Unix/Apple计算机上生成的文本文件通常使用一个换行符分隔行:
    \n
  • Windows计算机上生成的文本文件通常用两个字符分隔行,回车+换行:
    \r\n
  • 在非常旧的Apple机器上生成的文本文件通常使用回车符分隔行:
    \r
    。您可能不需要担心这一点,因为在实践中很少遇到这种情况
维基百科有

你的问题 看起来您的示例文件是在Windows上创建的,因此每行之间有两个字符。这意味着当您在
\n
上执行
explode()
操作时,除最后一行外,每一行的末尾都将包含一个不可见的
\r
字符。这就是为什么在您的示例中只有最后一行匹配

解决 根据多行字符串数据的来源,有几种解决方案

如果您的情况如示例所示,其中字符串在您控制的文件中定义为文本字符串,则有两个选项:

  • 将文件转换为使用Unix样式的行尾。大多数文本编辑器/IDE允许您通过菜单选项执行此操作。每个文件只需执行一次此操作(假设您在进行更改后将其保存)。如果进行此更改,当前代码将按原样工作
  • 更新代码以使用
    $array=explode(\r\n“,$multiline\u string)以便根据Windows行结尾进行分解
  • 另一方面,如果数据来自用户输入,则应对其进行编码以处理这两种类型的行尾1。这里也有几个选项:

  • 确保执行拆分的代码识别两种行尾样式。最简单的方法是将
    explode()
    调用替换为
    $array=preg\u split(“/\r?\n/”,$multiline\u string)
    ,它将在
    \n
    \r\n
    的任何实例上分解
  • 将一种行尾样式转换为另一种,以便了解正在使用的行尾样式,然后像前面一样使用
    explode()
    。例如,
    $multiline\u string=str\u replace(“\r\n”、“\n”、$multiline\u string)。如果以后要对字符串执行其他操作,例如将其存储在数据库中,则此方法更可取,因为这意味着您只需处理一次,而不必在所有情况下同时处理这两种可能性


  • 1或所有三种类型,如果您想彻底了解。这是留给读者的练习…

    您可能有dos行结尾,“第一行”实际上是“第一行”\r这个答案解释得很好:您可以在
    \r
    上使用
    preg\u split
    :它已经很好用了。@Sorin感谢您的提示。我刚刚尝试将
    explode(“\n”,$multiline\u string)
    更改为
    explode(\r\n”,$multiline\u string)
    ,效果很好。所以这就是dos行结尾的问题。你可能想在换行符之前和之后添加可选的空格,这取决于输入的格式有多好。在行尾添加一个不可见的空格很容易,有时粗心的人甚至会在行首添加空格。谢谢大家。在这种情况下,
    preg_split
    似乎比
    explode
    更可靠。此答案中的正则表达式无效:
    警告:preg_split()[function.preg split]:在第5行的index.php中找不到结尾分隔符“?”。你丢失了正则表达式分隔符。哈哈,我忘了。多么糟糕的语法。两个世界中最糟糕的。我认为任何其他语言都不需要用引号和斜杠来分隔正则表达式。谢谢。关于使用
    str_replace
    使所有行尾相同以供以后的字符串处理,这一点很好。谢谢-我已经用包含正确正则表达式的详细信息更新了答案(而不是遵从接受的答案),因为接受的答案实际上并不正确。除了一些PHP警告之外,它不会输出任何内容。因此,这个答案现在是完全独立的。
    <?php
    
    $multiline_string = 'First line
    Second line
    Third line';
    
    $array = explode("\n", $multiline_string);
    
    dd($array);
    
    if (in_array("First line\r", $array)){ //here we added a carriage return
        echo 'First line exists.'.'<br>';
    }
    
    if (in_array("Second line\r", $array)){ //here we added a carriage return
        echo 'Second line exists.'.'<br>';
    }
    
    if (in_array("Third line", $array)){ //here we did not
        echo 'Third line exists.'.'<br>';
    }
    
    function dd($something){
        echo '<pre>';
        var_dump($something);
        echo '</pre>';
    }
    
    array(3) {  
      [0]=>  
      string(11) "First line  
    "  
      [1]=>  
      string(12) "Second line  
    "  
      [2]=>  
      string(10) "Third line"  
    }
    
    First line exists.
    
    Second line exists.
    
    Third line exists.