2017-02-17 74 views
0

我很好奇,如果有可能讓這段代碼變得更短,可能更快?下面這段代碼的目標是通過更改(並保留)其中的數字來更新字符串,其中使用有序替換(例如{#0},{#1}等)來查找每個數字。更新字符串並保存數組中的舊數據

此外,將發現的數字分別保存在數組中,以便我們隨時可以恢復信息。

下面的代碼工作,但我相信它可能會顯着優化,並希望在一步完成。

$str = "Lnlhkjfs7834hfdhrf87whf4akuhf999re";//could be any string 

$nums = array(); 
$count = 0; 

$res = preg_replace_callback('/\d+/', function($match) use(&$count) { 
    global $nums; 
    $nums[] = $match[0]; 
    return "{#".($count++)."}"; 
}, $str); 

print_r($str); // "Lnlhkjfs7834hfdhrf87whf4akuhf999re" 

print_r($res); // "Lnlhkjfs{#0}hfdhrf{#1}whf{#2}akuhf{#3}re" 

print_r($nums); // ([0] => 7834 [1] => 87 [2] => 4 [3] => 999) 

這可能嗎?

回答

2
$str = "Lnlhkjfs7834hfdhrf87whf4akuhf999re";//could be any string 

    $nums = array(); 
    $count = 0; 

    $res = preg_replace_callback('/([0-9]+)/', function($match) use (&$count,&$nums) { 
     $nums[] = $match[0]; 
     return "{#".($count++)."}"; 
    }, $str); 

    print_r($str); // "Lnlhkjfs7834hfdhrf87whf4akuhf999re" 

    print_r($res); // "Lnlhkjfs{#0}hfdhrf{#1}whf{#2}akuhf{#3}re" 

    print_r($nums); // ([0] => 7834 [1] => 87 [2] => 4 [3] => 999) 

經過一些小的修復後,它的工作原理。 \d+也可以。

注意:無法解釋爲什麼global $nums;不會工作。也許PHP的內部問題/錯誤

1

不多說@JustOnUnderMillions回答,只是用其它方法,避免回調函數:

$nums = []; 

$res = preg_split('~([0-9]+)~', $str, -1, PREG_SPLIT_DELIM_CAPTURE); 

foreach ($res as $k => &$v) { 
    if ($k & 1) { 
     $nums[] = $v; 
     $v = '{#' . ($k >> 1) . '}'; 
    } 
} 

$res = implode('', $res); 

爲不短,但速度更快。

相關問題