Программно заменить представление значений в массиве PHP

У меня есть эти имена переменных тома. Перед тем, как представить их пользователям, их необходимо «ретушить».

$unit[] = 'cm3';
$unit[] = 'barrel_petrolium';
$unit[] = 'register_tons';
$unit[] = 'ocean_tons';
$unit[] = 'gal_us';
$unit[] = 'gal_uk';
  1. 3 должен быть преобразован в ³
  2. _ должен быть преобразован в один пробел
  3. когда есть _xx в конце его нужно преобразовать в (XX),

У меня нет проблем по первым 2 правилам. Как я могу также применить 3-е правило?

# replacements
$search  = array('3', '_');
$replace = array('³', ' ');

# units
$temp = str_replace($search, $replace, $unit); //1st and 2nd rules

$formatted[] = $temp;
print_r($formatted);

Результат будет:

cm³
barrel petrolium
register tons
ocean tons
gal us
gal uk

Так должно быть:

cm³
barrel petrolium
register tons
ocean tons
gal (US)
gal (UK)

Есть идеи? Спасибо!

2

Решение

Вы можете использовать preg_replace_callback:

$unit[] = 'cm3';
$unit[] = 'barrel_petrolium';
$unit[] = 'register_tons';
$unit[] = 'ocean_tons';
$unit[] = 'gal_us';
$unit[] = 'gal_uk';

$result = array_map(function ($item) {
$item = preg_replace_callback('~_\K[a-z]{2}\z~', function ($m) {
return '(' . strtoupper($m[0]) . ')';
}, $item);
return strtr($item, array('3' => '³', '_' => ' '));
}, $unit);

print_r($result);

детали шаблона:

~          # pattern delimiter
_          # literal _
\K         # keep out all on the left (the underscore here)
[a-z]{2}   # two lowercase letters
\z         # anchor for the end of the string
~          # delimiter

С \K функция, только две буквы в конце будут заменены. Замена подчеркивания — это работа strtr() (функция перевода символов и больше)

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]