-4

我有以下代码。

$obj->symbol = str_replace('PR.', 'p', $obj->symbol);
$obj->symbol = str_replace('UN.', 'u', $obj->symbol);
$obj->symbol = str_replace('RT.', 'r', $obj->symbol);
$obj->symbol = str_replace('WT.', 'w', $obj->symbol);
$obj->symbol = str_replace('PR', 'p', $obj->symbol);
$obj->symbol = str_replace('UN', 'u', $obj->symbol);
$obj->symbol = str_replace('RT', 'r', $obj->symbol);
$obj->symbol = str_replace('WT', 'w', $obj->symbol);

如您所见,这看起来非常丑陋。我怎样才能把它减少到更少的行?

4

3 回答 3

7

You can pass an array into the function. Do something like this:

$obj->symbol = str_replace(array('PR.','UN.'), array('p','u'), $obj->symbol);
于 2013-03-26T19:13:15.557 回答
4

我最推荐的是具有相同替换的冷凝线:

$obj->symbol = str_replace( array( 'PR.', 'PR'), 'p', $obj->symbol);

至少这仍然是可维护和可读的。如果您将其压缩为包含两个大型数组的一行,则应将该数组存储为key => value替换映射,并strtr()改用:

$replacements = array(
    'PR'  => 'p',
    'PR.' => 'p' 
    // etc
);

$obj->symbol = strtr( $obj->symbol, $replacements);
于 2013-03-26T19:17:35.073 回答
0

我参加聚会有点晚了,但我一直是 preg_replace_callback() 的粉丝:

$good_string = preg_replace_callback('/([PURW])[RNT]\.?/',function ($matches){
  return strtolower($matches[1]);
},$bad_string);
于 2014-04-17T01:36:21.370 回答