php 内爆(101)带引号
Posted
技术标签:
【中文标题】php 内爆(101)带引号【英文标题】:php implode (101) with quotes 【发布时间】:2011-08-31 10:30:38 【问题描述】:内爆一个简单的数组
看起来像这样
$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'
有没有更好的方法来做到这一点,我觉得应该有一个可选参数 implode 我错过了什么吗?
【问题讨论】:
我看到很多 cmets 关于提供的答案“较慢”。 没关系。选择更清晰、更易于维护的方式,以后再担心性能,如果有的话。 唯一的缺点是如果数组为空,它会产生一个空字符串。 IE。相当于$comma_separated = "''";
伟大的解决方案 mcgralm... 非常感谢它
感谢@mcgrailm,它适用于我的项目。真的很感激。
【参考方案1】:
不,你这样做的方式很好。 implode()
只需要 1-2 个参数(如果你只提供一个数组,它会通过一个空字符串连接各个部分)。
【讨论】:
似乎这些解决方案中的任何一个都没有速度差异,我将继续按照我一直以来的方式进行操作,感谢大家的帮助【参考方案2】:如果你想使用循环,你也可以这样做:
$array = array('lastname', 'email', 'phone');
foreach($array as &$value)
$value = "'$value'";
$comma_separated = implode(",", $array);
演示:http://codepad.org/O2kB4fRo
【讨论】:
@mcgrailm,比什么慢?它与array_map
基本相同,但不使用array_map
比我目前创建 csv 字符串的方式慢
@mcgrailm 查看@FelixKling 的评论
+1 似乎是唯一一个正确的答案 - 尝试内爆空数组时,所有其他答案都会产生空字符串。这个不会。
谢谢@DenisMatafonov :-)【参考方案3】:
你可以使用array_map()
:
function add_quotes($str)
return sprintf("'%s'", $str);
$csv = implode(',', array_map('add_quotes', $array));
DEMO
如果你想写入文件,还要注意fputcsv
。
【讨论】:
@Felix Kling 我怀疑这也会更慢? @mcgrailm,我再次问:比什么慢? @mcgrailm:也许吧,我建议你做一个基准测试并找出答案;) @Felix Kling 我该怎么做? 这有一个额外的好处是允许您转义可能出现在数组元素中的任何单引号【参考方案4】:你也可以这样做
<?php
$csv= '\'' . join(array('lastname', 'email', 'phone'),'\',').'\'';
echo $csv;
?>
【讨论】:
join 只是 implode 的别名【参考方案5】:$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", $array) . "'";
【讨论】:
越简单越好 这对我有用 使用此解决方案时请注意空数组。 谢谢。我用这个<ul> <li> !! implode('</li><li>', session('messages')) !! </li> </ul>
【参考方案6】:
不知道是否更快,但是,您可以使用您的方法节省一行代码:
来自
$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";
收件人:
$array = array('lastname', 'email', 'phone');
$comma_separated = "'".implode("','", $array)."'";
【讨论】:
我可以进一步,但将数组的定义放在变量 $array 的最后一行但我的速度差异会如此有限【参考方案7】:我认为这就是你想要做的事情
$array = array('lastname', 'email', 'phone');
echo "'" . implode("','", explode(',', $array)) . "'";
【讨论】:
【参考方案8】:如果你想避免 fopen/fputcsv 子系统,这里有一个 sn-p,它从关联数组构建一个转义的 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";
然后就可以根据需要输出字符串了。
【讨论】:
【参考方案9】:您也可以创建这样的函数:
function implode_with_quotes(array $data)
return sprintf("'%s'", implode("', '", $data));
【讨论】:
【参考方案10】:$ids = sprintf("'%s'", implode("','", $ids ) );
【讨论】:
很棒,简单直接。【参考方案11】:另一个可能的选项,取决于您需要数组的用途:
$array = array('lastname', 'email', 'phone');
echo json_encode($array);
这将在字符串周围放置 '[' 和 ']',您可能想要也可能不想要。
【讨论】:
【参考方案12】:别忘了转义您的数据! 如果您想将数据放入没有 fputcsv 函数的 CSV 文件中或放入 SQL 查询中,请使用以下代码:
$comma_separated = "'" . implode("','", array_map('addslashes', $array)) . "'";
当输入数组包含单引号或反斜杠字符时,此代码可避免SQL注入或数据碎片。
【讨论】:
【参考方案13】:$id = array(2222,3333,4444,5555,6666);
$ids = "'".implode("','",$id)."'";
或者
$ids = sprintf("'%s'", implode("','", $id ) );
【讨论】:
【参考方案14】:使用 implode + preg_replace 实现的另一种解决方案如下:
$a = ['A', 'B', 'C'];
implode(',', preg_replace('/^(.*)$/', '"$1"', $a)); // "A","B","C"
$b = [];
implode(',', preg_replace('/^(.*)$/', '"$1"', $b)); // empty string
如您所见,这也使您不必检查数组是否为空。
【讨论】:
【参考方案15】:试试这个代码:
$data = 'ABC,DEF,GHI';
$str = "'".str_replace(',',"','",$data)."'";
echo $str;
【讨论】:
以上是关于php 内爆(101)带引号的主要内容,如果未能解决你的问题,请参考以下文章