2013-05-08 5 views
9

$text에있는 {{key}} 개의 항목을 전달 된 배열의 값으로 바꾸려고합니다. 하지만 print_r을 추가하려고 시도했을 때 어떤 일이 일어나고 있는지 확인하기 위해 Undefined variable: kvPairs 오류가 발생했습니다. preg_replace_callback 내 변수 양식에 액세스하려면 어떻게해야합니까?preg_replace_callback에서 변수에 액세스하려면 어떻게해야합니까?

public function replaceValues($kvPairs, $text) { 
    $text = preg_replace_callback(
     '/(\{{)(.*?)(\}})/', 
     function ($match) { 
      $attr = trim($match[2]); 
      print_r($kvPairs[strtolower($attr)]); 
      if (isset($kvPairs[strtolower($attr)])) { 
       return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>"; 
      } else { 
       return "<span class='attrUnknown'>" . $attr . "</span>"; 
      } 
     }, 
     $text 
    ); 
    return $text; 
} 

업데이트 :

나는 global 범위의 일을 시도했지만, 그 중 하나가 작동하지 않습니다. 나는 2 장의 print 서술문을 추가하여 무엇이 수행되고 있는지를 확인했습니다. 하나는 내부이고 다른 하나는 preg_replace_callback 외부에 있습니다.

public function replaceValues($kvPairs, $text) { 
    $attrTest = 'date'; 
    print_r("--" . strtolower($attrTest) . "--" . $kvPairs[strtolower($attrTest)] . "--\n"); 
    $text = preg_replace_callback(
     '/(\{{)(.*?)(\}})/', 
     function ($match) { 
      global $kvPairs; 
      $attr = trim($match[2]); 
      print_r("==" . strtolower($attr) . "==" . $kvPairs[strtolower($attr)] . "==\n"); 
      if (isset($kvPairs[strtolower($attr)])) { 
       return "<span class='attr'>" . $kvPairs[strtolower($attr)] . "</span>"; 
      } else { 
       return "<span class='attrUnknown'>" . $attr . "</span>"; 
      } 
     }, 
     $text 
    ); 
    return $text; 
} 

내가 얻을 출력은 다음과 같습니다

--date--1977-05-20-- 
==date==== 

답변

35

로 선언, 당신의 콜백 함수에서 범위를 벗어난다는 폐쇄된다 use

function ($match) use ($kvPairs) { 
    ... 
} 
01을 통해 추가 인수를 전달할 수 있습니다.

글로벌 공간을 오염시키는 것보다 더 우수합니다

+0

다음 일치를 위해 $ kvPairs를 조작하고 싶습니다. 그렇지 않습니까? 아니면 글로벌 변수가 필요합니까? – Wikunia

+4

콜백 내에서'$ kvPairs'를 조작해야한다면 다음과 같이 ___by reference___를 전달하면됩니다 : function ($ match) use (& $ kvPairs) { ... }'' –

-1

$kvPairs이 콜백 함수로 글로벌

function($match) { 
    global $kvPairs; 
    ... 
} 
+0

이것은 작동하지 않습니다 – Justin808

관련 문제