2015-10-01 24 views
0

我遇到了一些問題......我已經完成了一些研究,並且我被告知在foreach中使用array_merge可能會特別慢並且佔用大量內存,我需要替代這個代碼塊。但我不知道什麼是最好的方法PHP array_merge在循環中使用時特別慢並且佔用大量內存

任何人都可以幫忙嗎?

/** 
* Parse long itrative tags 
* 
* Return array of matches for iterative tag pattern e.g. {%label%} to output the document label on this iteration of the loop 
* 
* @access public 
* @return array 
*/ 

function parse_long_iterative_tags($text) 
{ 
    $pattern = "/{%(?P<type>[A-Za-z0-9_?!]+):\((?P<name>.+)\)[\s]*(?P<attributes>[A-Za-z0-9\s_,:?.\/\-\|\(\)]*?){[\s]*(?P<content>(.*?[\s]*)*)[\s]*\}[\s]*end\\1\%}/"; 
    preg_match_all($pattern,$text,$matches); 
    if(!empty($matches['content'])): 
     $nested = implode("",$matches['content']); 
     $sub_matches = $this->parse_long_iterative_tags($nested); 
     foreach($matches as $k=>$v): 
      $matches[$k] = array_merge($matches[$k],$sub_matches[$k]); 
     endforeach; 
     return $matches; 
    else: 
     return $matches; 
    endif; 
    return $matches; 
} 
+0

你想用它完成什麼? – MiltoxBeyond

+0

如果我們能夠看到正在處理的數據的示例,那麼可能會更容易理解您正在執行的操作。否則,你只會得到一堆猜測 – RiggsFolly

+0

是的。因爲到目前爲止,我看到你可以簡單地做$匹配[$ k] [] = $ sub_matches [$ k] – MiltoxBeyond

回答

0

你試過只是採用了雙迴路運行它像這樣反而

foreach($matches as $k=>$v): 
    $matches[$k] = array_merge($matches[$k],$sub_matches[$k]); 

你會做:

foreach($matches as $k=>$v) 
    foreach($submatches[$k] as $j=>$v2) 
    $matches[$k][$j] = $v2; 

應該大致代表相同的輸出,但話又說回來您應該嘗試發佈產生的$matches數組的var轉儲以確保。