我怎么能爆炸和修剪空白?

Sea*_*nWM 143 php trim explode higher-order-functions

例如,我想从这个字符串中的元素创建一个数组:

$str = 'red,     green,     blue ,orange';
Run Code Online (Sandbox Code Playgroud)

我知道你可以爆炸并循环它们并修剪:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}
Run Code Online (Sandbox Code Playgroud)

但我觉得有一种单线方法可以解决这个问题.有任何想法吗?

Sea*_*nWM 403

您可以使用array_map执行以下操作:

$new_arr = array_map('trim', explode(',', $str));
Run Code Online (Sandbox Code Playgroud)

  • 这也是由PHP循环(内部) (10认同)
  • @JasonOOO我认为在大多数人看来,几毫秒(如果是这样)是一个公平的权衡,因为它有一行简短易读的代码. (4认同)
  • 简单易懂。但是,如果处理大型数据集,@amr-eladwy 提供的性能更高的答案是更好的解决方案。 (2认同)

Amr*_*awy 49

改进了答案

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');
Run Code Online (Sandbox Code Playgroud)

结果:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)
Run Code Online (Sandbox Code Playgroud)

这个

  • 仅限逗号分割
  • 修剪每个项目的空白.
  • 忽略空项目
  • 不拆分带有"绿色物品"等内部空间的物品

  • 任何人都可以解释为什么这个答案没有100个赞成票吗?Regexp很难理解,但它比其他解决方案更快地解析了我的100Mb文件 (7认同)
  • 我很高兴您发现它很有帮助.我阅读了所有答案,并提供了更好的组合.可以详细解释正则表达式. (2认同)
  • 抱歉,此正则表达式是错误的-尝试将`red`替换为* red *。更好的可能是/(\ s *,\ s *)+ / (2认同)

小智 24

以下内容还处理输入字符串开头/结尾的空格:

$new_arr = preg_split('/\s*,\s*/', trim($str));
Run Code Online (Sandbox Code Playgroud)

这是一个最小的测试,在每个合理的位置都有白色空格:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
Run Code Online (Sandbox Code Playgroud)


Ami*_*rma 7

这是你如何在一行代码中替换和爆炸

$str = 'red,     green,     blue ,orange';

$new_string = explode(',',preg_replace('/\s+/', '', $str));
Run Code Online (Sandbox Code Playgroud)

将输出结果为

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
Run Code Online (Sandbox Code Playgroud)

  • 这会删除字符串内的空格。例如,“海军蓝”变为“naviblue” (3认同)

小智 5

通过结合现有答案中的一些原则,我想出了

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);
Run Code Online (Sandbox Code Playgroud)

其背后的原因是我在此答案中发现了一个错误,如果字符串末尾有逗号,它将返回数组中的空白元素。IE

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');
Run Code Online (Sandbox Code Playgroud)

结果是

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)
Run Code Online (Sandbox Code Playgroud)

您可以通过使用本答案中提到的PREG_SPLIT_NO_EMPTY将其删除来解决此问题,但是一旦您这样做,技术上就不需要通过正则表达式删除连续的逗号,因此缩短的表达式