2014-09-15 1 views
2

나는이 볼륨 변수 이름을 가지고 있습니다. 사용자에게 제시하기 전에 "수정"해야합니다.PHP 배열에서 값의 표현 방식을 프로그래밍 방식으로 바꾸기

$unit[] = 'cm3'; 
$unit[] = 'barrel_petrolium'; 
$unit[] = 'register_tons'; 
$unit[] = 'ocean_tons'; 
$unit[] = 'gal_us'; 
$unit[] = 'gal_uk'; 
    3 개 요구
  1. ³ 변환 끝에 _xx있을 때 _ 그것을 한 공간
  2. 로 변환해야한다
  3. (XX)

처음 두 규칙에는 아무런 문제가 없습니다. 어떻게 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) 

어떤 아이디어? 고마워요!

답변

4

당신은 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); 

패턴 세부 사항 : \K 기능을

~   # 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 

, 말에만 두 글자가 대체됩니다. 밑줄의 대체는 strtr() (문자 변환 함수 이상)

+0

의 작업입니다. 제 설치 배열이 예제보다 약간 복잡하므로 대신 preg_replace와 함께 솔루션을 사용해야했습니다. 감사! – andufo

+0

@andufo : 무엇 대신에? strtr 대신에? preg_replace_callback 대신 –

+0

preg_replace입니다. – andufo