Удаление символа из конца массива un

Я использую этот код для отображения первых букв из строки, где $atit является массивом этой строки, и результаты должны быть что-то вроде "R. & B. & T.". Но этот код отображает результаты типа "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. & TI T). но проблема в том, что он добавляет дополнительный "&" в конце (R. & B. & TI T &).

3 ответа

Решение

Если вы имели в виду формирование "аббревиатуры", состоящей из первого символа каждой строки из массива строк - вот сложное решение с использованием 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;
Другие вопросы по тегам