PHP内爆(101)带引号


115

插入一个简单数组

看起来像这样

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

那会返回这个

 lastname,email,phone

很好,所以我可以代替

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

现在我有了我想要的漂亮的csv字符串

 'lastname','email','phone'

有没有更好的方法可以做到这一点,在我看来应该有一个可选的参数爆破,我错过了什么吗?


11
我看到很多关于提供的答案“较慢”的评论。没关系。选择更清晰,更可维护的方式,如果有的话,请稍后再担心性能。
meagar

1
唯一的缺点是,如果数组为空,它将产生一个空字符串。即。相当于$comma_separated = "''";
scipilot 2014年

1
伟大的解决方案mcgrailm ...非常感谢
Sandeep Garg

1
谢谢@mcgrailm,它正在为我的项目工作。非常感谢。
Wafie Ali

Answers:


29

不,您的操作方式很好。implode()仅需要1-2个参数(如果您仅提供一个数组,它将通过一个空字符串将各个部分连接起来)。


在所有这些解决方案中似乎都没有速度差异,我将继续以自己一直拥有的方式进行操作,感谢大家的帮助
mcgrailm 2011年


42

您可以使用array_map()

function add_quotes($str) {
    return sprintf("'%s'", $str);
}

$csv =  implode(',', array_map('add_quotes', $array));

演示

另请注意,fputcsv如果要写入文件,则存在。


@Felix Kling我怀疑这也会变慢吗?
mcgrailm 2011年

1
@mcgrailm,我再问一次:比什么还慢?
Naftali又名Neal,

2
@mcgrailm:也许,我建议您做一个基准测试并找出答案;)
Felix Kling

@Felix Kling我该怎么做?
mcgrailm 2011年

1
这样做还有一个好处,就是可以转义可能出现在数组元素中的任何单引号
meagar


23

不知道它是否更快,但是,您可以使用方法保存一行代码:

$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";

至:

$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";

而且我可以进一步说,但是将数组的定义放在变量$ array在最后一行的位置,但是我的速度差异是如此有限
mcgrailm 2013年

8

如果要使用循环,也可以执行以下操作:

$array = array('lastname', 'email', 'phone');
foreach($array as &$value){
   $value = "'$value'";
}
$comma_separated = implode(",", $array);

演示:http//codepad.org/O2kB4fRo


1
@mcgrailm,比什么还慢?它与array_map不使用它基本相同,但不使用array_map
Naftali aka Neal,

慢于我当前创建csv字符串的方式
mcgrailm 2011年

@mcgrailm看到@FelixKling的评论
Naftali又名Neal,

1
+1似乎是唯一的正确答案-尝试内插空数组时,所有其他答案都会产生空字符串。这个不会。
丹尼斯·马塔福诺夫

谢谢@DenisMatafonov :-)
Naftali又名Neal

2

另外,您可以创建这样的功能:

function implode_with_quotes(array $data)
{
    return sprintf("'%s'", implode("', '", $data));
}

1

如果要避免使用fopen / fputcsv子系统,请使用以下代码段,该代码段可从关联数组中构建转义的CSV字符串...。

$output = '';
foreach ($list as $row) {
  $output .= '"' . implode('", "', array_values($row)) . '"' . "\r\n";
}

或从对象列表中...

foreach ($list as $obj) {
  $output .= '"' . implode('", "', array_values((array) $obj)) . '"' . "\r\n";
}

然后,您可以根据需要输出字符串。



0

我想这就是你想做的

$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";

0

另一个可能的选择,取决于您需要的数组:

$array = array('lastname', 'email', 'phone');
echo json_encode($array);

这会将'['和']'放在您可能想要或不想要的字符串周围。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.