用空格分隔的字符串创建数组

35

我有一个输入框,用户可以在其中输入多个单词,并被告知使用空格进行分隔。因此,输入可能看起来像这样:

foo
或者像这样:
foo bar php js

我该如何检查字符串中是否有空格,如果有空格,如何拆分单词并将其放入数组中?我会在程序中循环遍历该数组。我对这种字符串处理方式还比较陌生。


15
爆炸。 - BoltClock
7个回答

104

参见explode

// Example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

14

是的,explode 可以为您完成所有操作,并且可以使用foreach 从数组中检索值。您的完整代码将类似于以下内容:

$str = "foo bar php js";
$arr =  explode(" ", $str);

//print all the value which are in the array
foreach($arr as $v){
    echo $v;
}

希望这可以帮助你。


5

Daniel已经讲解了分割部分,让我来添加空格检查部分。

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pizza = trim($pizza);

if(strpos($pizza, " ") !== false)

    $pieces = explode(" ", $pizza);
    echo $pieces[0]; // piece1
    echo $pieces[1]; // piece2

}else{

    echo $pizza;

}

虽然这是旧的代码,但它无法检测空格 - 我不得不使用if(strpos($pizza, " ") !== false)。我编辑了原始帖子,因此评论可能变得多余。 - weekapaug
1
如果您使用此脚本来从表单中分离输入值,并希望确保名称之间只有1个空格,例如将名称字符串拆分为名字+中间名+姓氏。那么请先使用以下转换:$pizza = preg_replace('!\s+!', ' ', $pizza);这样您就可以得到漂亮的单个空格分隔的单词,然后可以将其分解为数组值。 - nh-labs

5
您的样本输入相对平静。如果您信任用户完美地输入限定子字符串,这些字符串总是由一个空格分隔的话,则最佳选择是使用 explode()
如果用户输入可能超出小写字母或者您想在提取时进行验证,则有其他更适合的函数可供调用。
理解您的业务逻辑将决定此任务的最佳解决方案。
演示:链接
$input = "foo bar, php js  double-space apo'strophe 9 ";

echo 'explode(): '; var_export(explode(' ', $input));

echo "\npreg_split(): "; var_export(preg_split('/ +/', $input, null, PREG_SPLIT_NO_EMPTY));

echo "\nstr_word_count(): "; var_export(str_word_count($input, 1));

echo "\npreg_match_all(): "; var_export(preg_match_all('/[a-z]+/', $input, $output) ? $output[0]: []);

输出:

explode(): array (
  0 => 'foo',
  1 => 'bar,',
  2 => 'php',
  3 => 'js',
  4 => '',
  5 => 'double-space',
  6 => 'apo\'strophe',
  7 => '9',
  8 => '',
)
preg_split(): array (
  0 => 'foo',
  1 => 'bar,',
  2 => 'php',
  3 => 'js',
  4 => 'double-space',
  5 => 'apo\'strophe',
  6 => '9',
)
str_word_count(): array (
  0 => 'foo',
  1 => 'bar',
  2 => 'php',
  3 => 'js',
  4 => 'double-space',
  5 => 'apo\'strophe',
)
preg_match_all(): array (
  0 => 'foo',
  1 => 'bar',
  2 => 'php',
  3 => 'js',
  4 => 'double',
  5 => 'space',
  6 => 'apo',
  7 => 'strophe',
)

1
为了优化,我认为在使用explode函数之前最好删除多余的空格,比如双空格。例如:如果你有字符串"foo bar php js ",那么在使用explode函数之前,这个字符串必须变成"foo bar php js"。你可以尝试使用以下代码:
$charSet = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $charSet);
$charSet = rtrim($charSet);
$charSetArray = explode(" ", $charSet);
echo $charSetArray[0];
echo $charSetArray[1];

最好使用 preg_split('/ +/', $charSet); 来提高效率。 - Jeff

0
正如丹尼尔所说,explode()非常适合这种情况。您可能还想查看preg_split()(仅供参考),因为它接受正则表达式而不仅仅是简单的分隔符,并且可以让您按更复杂的模式拆分输入。

2
"split"已被弃用,应避免使用。如果需要正则表达式,请改用"preg_split"。 - ircmaxell
@ircmaxell已更新以反映当前情况。不幸的是,生产环境往往落后于最新版本,我忘记了一些在5.3中被弃用的东西。 - Endophage

0

This will work if there is no space between the input string.`

    $pieces = explode(" ", $pizza);
    if(count($pieces > 1)) {
        foreach($pieces as $piece) {
            echo $piece;
        }
    }
    else {
        echo $userInput;
    }
?>`

Explanation :
After exploding the string into pieces. Firstly it checks if we have more items in array i.e. $pieces if yes it will print via foreach loop otherwise it will simply print the user input.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接