我使用此代码显示字符串中的第一个字母,其中$atit
是该字符串的数组,结果必须类似于" R. &安培; B.&吨。&#34 ;.但是此代码显示的结果类似于" R. &安培; B.& T.&"。
是否有可能摆脱最后的"&"?我尝试在rtrim
行中使用echo
,但它删除了所有"&"而我只需要删除最后一个。
foreach ($atit as $ati) {
$pieces = explode(' ', $ati);
$otw = preg_replace('/\W\w+\s*(\W*)$/', '$1', $pieces);
$acronym = "";
foreach ($otw as $w) {
$acronym .= $w[0].'. ';
}
$bla = $acronym.' & ';
echo $bla;
}
我认为这是foreach
的问题,但我无法弄明白。有什么建议吗?
更新
数组中的每个条目都包含多个单词,因此上面的代码用于显示除每个条目中最后一个单词之外的所有单词的首字母。
示例:
$atit = ["Right now", "Behind you", "This is the time"];
因此上面的代码将首先删除每个数组条目中的最后一个单词,然后获取并显示其中剩余单词的第一个字母,如下所示(R.& B.& T.I.T)。但问题是它增加了额外的"&"到最后(R.& B.& T.I.T&)。
答案 0 :(得分:1)
如果你的意思是形成一个"首字母缩略词"包含字符串数组中每个字符串的第一个字符 - 这里是使用array_map
,array_slice
,implode
,explode
和ucfirst
函数的复杂解决方案:< / p>
$atit = ["Right now", "Behind you", "This is the time"];
$acronym = implode(" & ", array_map(function($v) {
$words = explode(" ", $v);
if (count($words) > 2) {
return implode(".", array_map(function($w) {
return ucfirst($w[0]);
}, array_slice($words, 0, -1)));
}
return $words[0][0] . "."; // for simple strings (less/equal two words)
}, $atit));
echo $acronym; // "R. & B. & T.I.T"
答案 1 :(得分:1)
当使用像这样的分隔符连接多个元素时,我更喜欢每次检查结果变量。如果不为空,我会添加连接分隔符。如果是空的,我不会。这样,你最终不会得到不需要的分隔符。
(或者只是创建一个元素数组并使用PHP implode()函数)
例如:
<?= myPar ?>
答案 2 :(得分:1)
我不明白为什么你需要那个正则表达式,为什么你要在每个循环迭代中打印单独的字符串片段。
我可以建议这个解决方案:
$atit = ["Right now", "Behind you", "This is the time"];
$partList = array();
foreach ($atit as $ati) {
$pieces = explode(' ', $ati);
$numberOfPieces = sizeof($pieces);
if ($numberOfPieces > 1) {
$pieces = array_slice($pieces, 0, $numberOfPieces-1);
}
$acronym = "";
foreach ($pieces as $w) {
$acronym .= strtoupper($w[0]).'. ';
}
$partList[] = $acronym;
}
$bla = implode('& ', $partList);
echo $bla;