从 un 数组的末尾删除字符
Deleting character from the end of un array
我使用此代码显示字符串的首字母,其中 $atit
是该字符串的数组,结果必须类似于 "R. & B. & T."。但是此代码显示的结果类似于 "R. & B. & T. &".
是否可以去掉最后一个“&”?我尝试在 echo
行中使用 rtrim
但它删除了所有“&”,而我只需要删除最后一个。
foreach ($atit as $ati) {
$pieces = explode(' ', $ati);
$otw = preg_replace('/\W\w+\s*(\W*)$/', '', $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 &)。
如果您的意思是形成一个 "acronym",其中包含字符串数组中每个字符串的第一个字符 - 这里是使用 array_map
、array_slice
、[=13= 的复杂解决方案]、explode
和 ucfirst
函数:
$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"
像这样用分隔符连接多个元素时,我更喜欢每次都检查结果变量。如果不为空,我会在前面加上连接分隔符。如果是空的,我不会。这样,您就不会在最后得到不需要的分隔符。
(或者只是创建一个元素数组并使用 PHP implode() 函数)
例如:
$array = array("a", "b", "c", "d");
$result = "";
foreach ($array as $a)
{
if ($result != "") { $result .= " & "; }
$result .= $a;
}
// $result = "a & b & c & d"
我不明白你为什么需要那个正则表达式,为什么你在每次循环迭代中打印单独的字符串片段。
我可以建议这个解决方案:
$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;
我使用此代码显示字符串的首字母,其中 $atit
是该字符串的数组,结果必须类似于 "R. & B. & T."。但是此代码显示的结果类似于 "R. & B. & T. &".
是否可以去掉最后一个“&”?我尝试在 echo
行中使用 rtrim
但它删除了所有“&”,而我只需要删除最后一个。
foreach ($atit as $ati) {
$pieces = explode(' ', $ati);
$otw = preg_replace('/\W\w+\s*(\W*)$/', '', $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 &)。
如果您的意思是形成一个 "acronym",其中包含字符串数组中每个字符串的第一个字符 - 这里是使用 array_map
、array_slice
、[=13= 的复杂解决方案]、explode
和 ucfirst
函数:
$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"
像这样用分隔符连接多个元素时,我更喜欢每次都检查结果变量。如果不为空,我会在前面加上连接分隔符。如果是空的,我不会。这样,您就不会在最后得到不需要的分隔符。
(或者只是创建一个元素数组并使用 PHP implode() 函数)
例如:
$array = array("a", "b", "c", "d");
$result = "";
foreach ($array as $a)
{
if ($result != "") { $result .= " & "; }
$result .= $a;
}
// $result = "a & b & c & d"
我不明白你为什么需要那个正则表达式,为什么你在每次循环迭代中打印单独的字符串片段。
我可以建议这个解决方案:
$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;