我正在开发一个项目,用户可以通过表单选择最多 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","","",""
如果您有一个包含 6 个项目的数组,其中包括 3 个空字符串:
$arr = array('cat1', 'cat2', 'cat3', '', '', '');
implode
放入字符串中,这样:
echo '"' . implode('","', $arr) . '"';
您将得到以下输出:
"cat1","cat2","cat3","","",""
并且,由于 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","","",""
array
3 => string '' (length=0)
4 => string '' (length=0)
5 => string '' (length=0)
+
运算符 (引用) :
运算符追加以下元素 右手的剩余钥匙 数组向左,而 重复的键不会被覆盖。+
$arr = array('cat1', 'cat2', 'cat3', '', '', '', '');
$arr = array_slice($arr, 0, 6);
echo '"' . implode('","', $arr) . '"';
你可以尝试:
$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",""
如果您不介意创建一个临时数组来填充六个元素的乏味,并且您的类别值从不包含逗号,那么可以使用高度直观的本机函数
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()
而不是第二个片段中的硬编码逗号。
另请注意,这些片段并不是为了验证而设计的;仅解析假定有效的字符串。 为了提供验证建议,我们需要更好地了解您的业务背景并查看各种潜在的输入值。