Я использую этот код для отображения первых букв из строки, где $atit
массив этой строки и результаты должны быть что-то вроде «R. & B. & Т. «. Но этот код отображает результаты как» Р. & B. & Т. &».
Можно ли избавиться от последнего?&«Я пытался использовать 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. & Т. И. Т). но проблема в том, что он добавляет дополнительный&«до конца (р. & B. & Т. И. Т &).
Если вы имели в виду формирование «аббревиатуры», состоящей из первого символа каждой строки из массива строк — вот сложное решение с использованием array_map
, array_slice
, implode
, 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;