PHP在_数组中只查找最后一个数组元素
下面的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
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.