将逗号分隔的字符串拆分为数组?

350

我需要将输入的字符串按逗号分隔成数组。

有没有一种方法可以将逗号分隔的字符串拆分为平面、索引化的数组?

输入:

9,admin@example.com,8

输出:

['9', 'admin@example', '8']  

另外还可以查看如何按多个字符拆分,例如像 preg_split('/[-,\s]+/', 'Split-this, by dash comma and space'); 这样的。 - Top-Master
9个回答

718
尝试爆炸
$myString = "9,admin@example.com,8";
$myArray = explode(',', $myString);
print_r($myArray);

输出:

Array
(
    [0] => 9
    [1] => admin@example.com
    [2] => 8
)

1
你怎么获取数量?.length? - user3402040
2
一种方法是使用count()(又名sizeof)- http://php.net/manual/en/function.count.php - Matthew Groves
3
@McLosysCreative 你可能也会喜欢 var_dump,它提供更详细的信息。更实用的是 var_export($myArray, true),因为它将 var_dump 的输出作为字符串返回,这样你就可以将其存储在一些日志中,而不会破坏生成的网站... - Tomasz Kapłoński

45
$string = '9,admin@google.com,8';
$array = explode(',', $string);

如果情况比较复杂,您可能需要使用preg_split


32
如果这个字符串来自CSV文件,我会使用fgetcsv()(如果您使用的是PHP V5.3,则可以使用str_getcsv())来正确解析带引号的值。 如果不是CSV文件,则explode()应该是最好的选择。

8
如果您希望您的部分包含逗号,那么请用引号引起来。那么引号呢?好的,请把它们加倍。换句话说:
part1,“part2,其中包含逗号和引号“””,part3
PHP 提供了https://php.net/str_getcsv函数,可以将一个字符串解析为 CSV 文件中的一行,可以与上述行一起使用,而不是使用explode函数。
print_r(str_getcsv('part1,"part2,with a comma and a quote "" in it",part3'));
Array
(
    [0] => part1
    [1] => part2,with a comma and a quote " in it
    [2] => part3
)

5

explode在实际使用中存在一些非常大的问题:

count(explode(',', null)); // 1 !! 
explode(',', null); // [""] not an empty array, but an array with one empty string!
explode(',', ""); // [""]
explode(',', "1,"); // ["1",""] ending commas are also unsupported, kinda like IE8

这就是为什么我更喜欢使用preg_split函数。
preg_split('@,@', $string, NULL, PREG_SPLIT_NO_EMPTY)

整个样板代码:
/** @brief wrapper for explode
 * @param string|int|array $val string will explode. '' return []. int return string in array (1 returns ['1']). array return itself. for other types - see $as_is
 * @param bool $as_is false (default): bool/null return []. true: bool/null return itself.
 * @param string $delimiter default ','
 * @return array|mixed
 */
public static function explode($val, $as_is = false, $delimiter = ',')
{
    // using preg_split (instead of explode) because it is the best way to handle ending comma and avoid empty string converted to ['']
    return (is_string($val) || is_int($val)) ?
        preg_split('@' . preg_quote($delimiter, '@') . '@', $val, NULL, PREG_SPLIT_NO_EMPTY)
        :
        ($as_is ? $val : (is_array($val) ? $val : []));
}

非常推荐使用这个答案,因为 preg_split 更加稳妥,尤其是当它包含用户输入时。 - Stender
这个答案的效率远不如使用explode()。我不会在任何专业脚本中使用它。如果您的输入字符串可能为空,请在分割之前编写一个简单的falsey检查,而不是使用包含文字字符的preg_调用。如果一个字符串可能有一个尾随分隔符,而你不想要那个,那么只需将分隔符rtrim()掉——同样,没有理由依赖正则表达式(虽然我喜欢正则表达式)。 - mickmackusa
发布于多年前:https://dev59.com/C3VD5IYBdhLWcg3wKoWH#64608 - mickmackusa

4
使用explode()或preg_split()函数在php中按给定分隔符拆分字符串。
// Use preg_split() function 
$string = "123,456,78,000";  
$str_arr = preg_split ("/\,/", $string);  
print_r($str_arr); 
  
// use of explode 
$string = "123,46,78,000"; 
$str_arr = explode (",", $string);  
print_r($str_arr); 

1
逗号在正则表达式中没有特殊含义,因此无需转义--这只会教授不必要的编码实践。使用preg_split()和一个字面字符是不合适的正则表达式用法,只会增加不必要的处理开销。我不建议任何研究人员使用第一种技术。至于explode(),这个见解早在多年前就已经提出了。这个答案可以安全地删除。 - mickmackusa

1
如果有人想将逗号分隔的字符串转换为列表项,使用for-each的话,以下代码可以帮助您... 此代码适用于blade模板
@php
$data = $post->tags;
$sep_tag= explode(',', $data);
@endphp

@foreach ($sep_tag as $tag)
 <li class="collection-item">{{ $tag}}</li>
 @endforeach 

0
//Re-usable function
function stringToArray($stringSeperatedCommas)
{
    return collect(explode(',', $stringSeperatedCommas))->map(function ($string) {
        return trim($string) != null ? trim($string) : null;
    })->filter(function ($string) {
        return trim($string) != null;
    });
}

//Usage
$array = stringToArray('abcd, , dsdsd, dsds');
print($array);

//Result
{ "abcd", "dsdsd", "dsds" }

1
这适用于 Laravel >= 5.2。 - Nikolay Bronskiy

0

逗号之间可能有空格。同时,逗号之间可能没有有用的数据。函数preg_split可以帮助处理这些情况:

$str = "1,2 ,  ,4, ";

$arr = preg_split("/\s*,\s*/", $str, -1, PREG_SPLIT_NO_EMPTY);

print_r($arr); // [1, 2, 4]

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