Замените последнюю запятую знаком &

Я искал везде, но не могу найти решение, которое работает для меня.

У меня есть следующее:

$bedroom_array = array($studio, $one_bed, $two_bed, $three_bed, $four_bed);

Для этого примера скажем:

$studio = '1';
$one_bed = '3';
$two_bed = '3';

Затем я использую функцию implode, чтобы поставить запятую между всеми значениями:

$bedroom_list = implode(", ", array_filter($bedroom_array));
echo $bedroom_list;

Затем это выводит:

1, 2, 3

Что я хочу сделать, так это найти последнюю запятую в строке и заменить ее на &, чтобы она читалась:

1, 2 и 3

Строка не всегда будет такой длинной, она может быть короче или длиннее, например. 1, 2, 3, 4 и так далее. Я изучил использование substr, но не уверен, что это сработает для того, что мне нужно?


person iain    schedule 07.10.2011    source источник


Ответы (6)


Вытащите последний элемент, соедините остальные вместе, а затем прикрепите последний элемент обратно.

$bedroom_array = array('studio', 'one_bed', 'two_bed', 'three_bed', 'four_bed');
$last = array_pop($bedroom_array);
$string = count($bedroom_array) ? implode(", ", $bedroom_array) . " & " . $last : $last;

При необходимости преобразуйте & в сущность &.

person Michael Berkowski    schedule 07.10.2011
comment
Я бы изменил $string = implode(", ", $bedroom_array) . " & " . $last; на $string = count($bedroom_array) ? implode(", ", $bedroom_array) . " & " . $last : $last;, чтобы охватить случаи, когда перед всплывающим элементом в массиве был только один элемент. Кроме того, если это просто идет прямо в браузер, используйте ' & ' вместо ' & '. - person daiscog; 07.10.2011
comment
Вот версия функции с небольшой проверкой ошибок: ideone.com/SQZfi - person Brad Christie; 07.10.2011
comment
Спасибо за вашу помощь! Я попытался использовать идею Майкла, но у меня возникли проблемы, поскольку переменные в массиве не всегда установлены - отсюда и использование array_filter. У меня работает &, но он все равно будет отображать последний массив, и я получу 1, 2 и 2 вместо 1 и 2. В конце концов я использовал код Брэда, который работал как мечта! Я все еще был бы заинтересован в других способах сделать это, хотя! - person iain; 07.10.2011

если у вас есть список слов, разделенных запятыми, вы можете использовать:

$keyword = "hello, sadasd, sdfgdsfg,sadfsdafsfd, ssdf, sdgdfg";
$keyword = preg_replace('/,([^,]*)$/', ' & \1', $keyword);
echo $keyword;

он выведет: привет, sadasd, sdfgdsfg, sadfsdafsfd, ssdf & sdgdfg

person codefreak    schedule 16.10.2012

Однострочная альтернатива, которая будет работать для массива любого размера ($b = $bedroom_array):

echo count($b) <= 1 ? reset($b) : join(', ', array_slice($b, 0, -1)) . " & " . end($b); 
person JRL    schedule 07.10.2011

function fancy_implode($arr){
    array_push($arr, implode(' and ', array_splice($arr, -2)));
    return implode(', ', $arr);
}

Мне легче читать/понимать и использовать

  • Не изменяет исходный массив
  • Не использует регулярные выражения, так как они могут дать сбой, если строки в массиве содержат запятые, для этого может быть уважительная причина, например: array('Shirts (S, M, L)', 'Pants (72 x 37, 72 x 39)');
  • Разделители не обязательно должны быть такой же длины, как в некоторых других решениях.
person Art Shipulin    schedule 23.11.2013

strrpos находит последнее вхождение указанной строки. $str = '1, 2, 3';

$index = strrpos( $str, ',' ); 
if( $index !== FALSE )
    $str[ $index ] = '&'; 
person aziz punjani    schedule 07.10.2011

Вот еще один способ выполнить замену регулярным выражением, используя положительный просмотр вперед, который не требует обратной ссылки:

$bedroom_list = preg_replace('/,(?=[^,]*$)/',' &', implode(', ', $bedroom_array));
person billynoah    schedule 18.09.2020