将 CSV 字符串填充为 6 个双引号值

问题描述 投票:0回答:3

我正在开发一个项目,用户可以通过表单选择最多 6 个类别(我正在使用 ExpressionEngine)。输出是这样的:

"Cat1","Cat2","Cat3"

...等等。用户可以在该表单上选择最多 6 个类别。

我需要什么:即使我的结果是 3 个类别,我也需要有 6 个“单元格”——因为缺少更好的词——即使它们是空的:

"Cat1","Cat2","Cat3","","",""

我试过这个:

<?php
$str = '(output goes here)';
print_r(explode(',', $str, 6));
?>

...但是输出给了我:

Array
(
[0] => Cat1
[1] => Cat2
[2] => Cat3
[3] =>
[4] =>
[5] =>

我如何从那个到这个:

"Cat1","Cat2","Cat3","","",""
php string csv padding
3个回答
6
投票

如果您有一个包含 6 个项目的数组,其中包括 3 个空字符串:

$arr = array('cat1', 'cat2', 'cat3', '', '', '');

您可以将这些

implode
放入字符串中,这样:

echo '"' . implode('","', $arr) . '"';

您将得到以下输出:

"cat1","cat2","cat3","","",""

基本上,“implode”允许您使用分隔符将数组的所有项目放入一个字符串中 - 在这里,分隔符是“”,“”,这是您可以在字符串之间使用的分隔符。

并且,由于 implode 仅在元素之间放置分隔符,因此我们必须在结果字符串的开头和结尾处放置一个额外的

"


*(希望我明白你的意思......)*

评论后编辑:

好的,如果您的

$arr
数组开头不包含六个项目 :

$arr = array('cat1', 'cat2', 'cat3');

一种可能是创建一个包含空元素的数组;像这样,例如:

$count = count($arr);

// Create an array with empty elements
$padding = array_fill($count, 6-$count, '');
var_dump($padding);

然后,将它们添加到

$arr
数组中:

// Add the empty elements to $arr
$arr = $arr + $padding;

(我想你也可以使用

array_merge

现在,回到我们的

implode

echo '"' . implode('","', $arr) . '"';

而且,这一次,你会得到:

"cat1","cat2","cat3","","",""

以下是 `var_dump($padding);` 提供的信息:
array
  3 => string '' (length=0)
  4 => string '' (length=0)
  5 => string '' (length=0)

而且,是的,您可以对数组使用

+
运算符 (引用) :

+
运算符追加以下元素 右手的剩余钥匙 数组向左,而 重复的键不会被覆盖。


如果你的 `$arr` 可能超过 6 个元素,你可以使用 [`array_slice`][4] 删除不需要的元素:
$arr = array('cat1', 'cat2', 'cat3', '', '', '', '');
$arr = array_slice($arr, 0, 6);
echo '"' . implode('","', $arr) . '"';

1
投票

你可以尝试:

$org = '"Cat1","Cat2","Cat3"';
$arr = explode(',',$org);
$arr = array_merge($arr,array_fill(count($arr),6-count($arr),'""'));
$str = implode(',',$arr);
echo($str); // prints "Cat1","Cat2","Cat3","","",""

即使

$org
6
或更少的猫也能工作:

如果

$org = "Cat1","Cat2","Cat3","cat4","cat5"

$str
将会是
"Cat1","Cat2","Cat3","cat4","cat5",""


0
投票

如果您不介意创建一个临时数组来填充六个元素的乏味,并且您的类别值从不包含逗号,那么可以使用高度直观的本机函数

array_pad()
来实现一种解决方案。 演示

$str = '"Cat1","Cat2","Cat3"';
echo implode(
         ',',
         array_pad(
             explode(',', $str),
             6,
             '""'
         )
     );
// "Cat1","Cat2","Cat3","","",""

稍微更强大的方法可以在使用

str_getcsv()
解析字符串之前将最少数量的逗号附加到字符串(这将为包含逗号的类别名称提供可爱的支持),然后将结果字符串格式化为始终具有 6 个类别(永远不会多,永远不会少)使用
vprintf()
vsprintf()
演示

vprintf(
    '"%s","%s","%s","%s","%s","%s"',
    str_getcsv("$str,,,,,",  escape: '')
);
// "Cat1","Cat2","Cat3","","",""

这些解析、填充和重新连接技术可以根据个人喜好在某种程度上互换。例如,您可以使用第一个片段中的

array_pad()
而不是第二个片段中的硬编码逗号。

另请注意,这些片段并不是为了验证而设计的;仅解析假定有效的字符串。 为了提供验证建议,我们需要更好地了解您的业务背景并查看各种潜在的输入值。

© www.soinside.com 2019 - 2024. All rights reserved.