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

Posted

技术标签:

【中文标题】将逗号分隔的字符串拆分为数组?【英文标题】:Split a comma-delimited string into an array? 【发布时间】:2010-11-10 16:13:51 【问题描述】:

我需要将我的字符串输入拆分为逗号处的数组。

有没有办法将逗号分隔的字符串分解为扁平的索引数组?

输入:

9,admin@example.com,8

输出:

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

【问题讨论】:

另见how to split by more than one character,例如preg_split('/[-,\s]+/', 'Split-this, by dash comma and space'); 【参考方案1】:

试试explode:

$myString = "9,admin@example.com,8";
$myArray = explode(',', $myString);
print_r($myArray);

输出:

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

【讨论】:

如何获得计数? .lengh? 一种方法是使用 count()(又名 sizeof)-php.net/manual/en/function.count.php @McLosysCreative 您可能还喜欢var_dump,它提供了更详细的信息。更有用的是var_export($myArray, true),因为它将var_dump 的输出作为字符串返回,因此您可以将其存储在某个日志中而不会破坏生成的站点...【参考方案2】:
$string = '9,admin@google.com,8';
$array = explode(',', $string);

对于更复杂的情况,您可能需要使用preg_split

【讨论】:

【参考方案3】:

如果该字符串来自 csv 文件,我会使用 fgetcsv()(如果您有 PHP V5.3,则使用 str_getcsv())。这将允许您正确解析引用的值。如果不是 csv,explode() 应该是最好的选择。

【讨论】:

【参考方案4】:

如果您希望零件包含逗号怎么办?好吧,引用他们。那么引号呢?好吧,把它们加倍。换句话说:

part1,"part2,with a comma and a quote "" in it",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 在包含用户输入时更加安全。 这个答案的效率将远低于使用explode()。我不会把它放在任何专业的脚本中。如果您的传入字符串可能为空,则在爆炸之前编写一个简单的错误检查,而不是使用包含文字字符的 preg_ 调用。如果一个字符串可能有一个尾随分隔符,而您不希望这样,那么只需关闭 rtrim() 分隔符——同样,没有理由依赖正则表达式(我喜欢正则表达式)。 多年前发表:***.com/a/64608/2943403【参考方案6】:

使用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); 

【讨论】:

逗号在正则表达式中没有特殊含义,因此无需转义——这只是为了教授不必要的编码实践。 preg_split() 带有文字字符是对正则表达式的不当使用,只会意味着不必要的处理开销。我不会向任何研究人员推荐第一种技术。至于explode(),这种见解早在几年前就已经提供了。此答案可以安全删除。【参考方案7】:

如果有人想使用 for-each 将逗号分隔的字符串转换为列表项,那么它将帮助您... 此代码用于刀片模板

@php
$data = $post->tags;
$sep_tag= explode(',', $data);
@endphp

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

【讨论】:

【参考方案8】:
//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" 

【讨论】:

这适用于 Laravel >= 5.2

以上是关于将逗号分隔的字符串拆分为数组?的主要内容,如果未能解决你的问题,请参考以下文章

拆分逗号分隔的字符串,同时删除空格和空条目

Redshift :- 易于将逗号分隔的字符串拆分为行

将逗号分隔的字符串拆分为 R 中定义的数量

将字符串拆分为 3d 数组

将逗号分隔的字符串拆分为mysql中的行

如何将逗号分隔的字符串拆分为字符串列表?