如何在换行符和单词上创建多 D 数组中断



如何将多行 PHP var 拆分为一个多维数组,该数组首先在 char 换行符上断开rn|r|n然后在单个 fowl 循环中按单词分解每个数组?

像这样

$text = <<<TEXT
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum 
TEXT;
$arr = array_map(function($item){return explode(' ',$item);},array_filter(array_map('trim',preg_split('/rn|r|n/',$text))));
print_r($arr);

输出

Array(
[0] => Array(
[0] => Lorem
[1] => ipsum
[2] => dolor
...
)
[1] => Array(
[0] => Ut
[1] => enim
[2] => ad
...
)
[2] => Array(
[0] => Duis
[1] => aute
...
)
)

在线试用

解释

  • <<<TEXT ... TEXT;是 HEREDOC 的另一种字符串方式,请不要担心。 我只是喜欢将它用于大块文本,但它对答案并不重要。

扩展版

$arr = array_map(
function($item){
return explode(' ',$item);
},array_filter(
array_map(
'trim',
preg_split('/rn|r|n/',$text)
)
)
);

因此,让我们一次完成一个。

  1. 首先我们做$arr = preg_split('/rn|r|n/',$text)
    • 这通过使用正则表达式作为行尾将文本拆分为数组,我们本可以使用[rn]+更干净一些,但无论如何。["Lorem ipsum", " ", " Duis aute irure"]
  2. 接下来我们做$arr = array_map('trim', $arr)数组
    • 映射针对数组中的每个元素调用函数 (arg1)。 因此,在这里我们修剪所有项目trim默认情况下会删除前导和尾随空格。 数组项中的每个项都是单独的文本行(见上文)。例如。["Lorem ipsum", "", "Duis aute irure"]
  3. 接下来我们做$arr = array_filter($arr)数组
    • 筛选器删除任何空的数组元素。 因为我们修剪了上面的一些,所以它也删除了只有空格的那些,例如。["Lorem ipsum", "", "Duis aute irure"]删除第二项,例如。["Lorem ipsum""Duis aute irure"]
  4. 接下来我们再次运行数组映射
    • 但这次使用自定义内联函数,应用于每个项目。
  5. 此自定义函数array_map
    • 只是在空格上爆炸,这会将所有单词分解为一个数组,这也是一个嵌套数组。 我们必须在闭包中包装爆炸,因为它需要 2 个参数,而 trim 只需要一个参数。例如。[["Lorem","ipsum"],["Duis","aute","irure"]]

仅此而已。

此外,您可以进一步运行:

function($item){
return array_filter(array_map('trim', explode(' ', $item)));
}

如果您对嵌套数组中的空格有问题。[["Lorem","ipsum", " "],[" Duis","aute","irure"]].

或者您也可以通过以下方式进行操作。这会更好一点,因为我们已经处于类似循环的结构中。 因此,我们将在文本中每行调用此匿名函数 1 次,然后在其中添加另一个 {n} 调用。

function($item){
return explode(' ', preg_replace('/s{2,}/', ' ', $item));
//trimming it, trim(preg_replace(...)) is not needed as it's already been trimmed.
}

此版本将在爆炸之前替换任何双倍或更多空格s{2,},这具有大致相同的效果,但可以防止嵌套循环。

我们不能在开始时轻易做到这一点,因为我们不想丢失我们的n行返回,这些返回也由s匹配,例如sit amet n有一个空格和一个新行。如果我们不小心,我们将冒着失去n的风险,因为s{2,}匹配它并会用一个空格替换它。

-注意-preg_splitexplode相似,只是preg_split允许您使用正则表达式。我们需要考虑来自不同操作系统的不同行尾 {ssSs}

(Winrn,Linuxn,Old Macr)

函数参考

  • preg_split
  • array_map
  • 修剪
  • array_filter
  • 爆炸

和(可选)

  • preg_replace

干杯!

最新更新