2012-11-12 30 views
2

我在FILTER_CALLBACK中使用'filter_var()'函數。
事情是這樣的:是否可以添加到filter_var()函數用戶定義的參數?

$value = filter_var($value, FILTER_CALLBACK, array('options' => 'my_func')); 

my_func,並將()通常可獲得$值作爲參數:

function my_func($val) 
{ 
    if (some cond) 
    { 
     return $val; 
    } 
    else 
    { 
     return false; 
    } 
} 

現在我想用在my_func,並將另一個是$ var()從外部範圍(我用filter_var()表示。
一種選擇是在函數中聲明它爲全局函數。另一個是把它作爲論點。
我該如何避免聲明全局並將$ var作爲參數傳遞?

+0

這可能是幫助你:http://codepad.org/dTNRVOl1 – GBD

+0

如果你正在寫反正一個回調函數,爲什麼不只是寫一個專門的功能爲這個特殊的過濾器和通它需要什麼參數? – Crisp

+0

,因爲filter_var在循環中使用,並且信息中的哪個過濾器將使用哪個值存儲在單獨的數組中。它會太昂貴和醜陋的檢查每個值是否是一個,這需要另一個功能 – lvil

回答

0

如果你使用PHP 5.3+,你可以使用閉:

function my_func($val, $arg1, $arg2) 
{ 
    return $arg1.': '.$val.' '.$arg2; 
} 

$testVar = 'test'; 
$result = filter_var($testVar, FILTER_CALLBACK, array('options' => function($var) { 
    return my_func($var, 'someValue', 'someOtherValue'); 
})); 

var_dump($result); // string(30) "someValue: test someOtherValue" 

當然,這個例子沒有真正的「驗證」什麼,只是改變了文本一點,但它應該讓你知道它是如何工作的。

編輯:從評論中判斷,您希望對某些值使用某個函數,而不檢查每個循環使用哪一個函數。你有沒有考慮過使用call_user_func?這裏有一個例子:

function myFunc1($arg1, $arg2) { return 'Executed myFunc1 with arguments: '.$arg1.' '.$arg2; } 
function myFunc2($arg1, $arg2) { return 'Executed myFunc2 with arguments: '.$arg1.' '.$arg2; } 

$functionsToUse = array(
    'myFunc1', 
    'myFunc2' 
); 

foreach ($functionsToUse as $func) 
{ 
    echo call_user_func($func, 'value', 'another value').'<br>'; 
} 
+0

是一種解決方案,但它的問題是,現在我無法在循環中執行標準驗證。 (我從值類型設置數組中取得「FILTER_CALLBACK」,因此它可以是任何其他驗證器)。我知道我可以檢查每個值使用哪個過濾器。 – lvil

+0

我提出的第一種方法如何?從閉包中獲取來自循環的變量(例如全局$ var1,$ var2;)(據我所知,閉包只會是「全局的」,它在使用後會消失,所以這不是一個真正的問題)。 – Dragory

0
function my_func($val,$val2=null) 
{ 
    if (some cond) 
    { 
     return $val; 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

我該如何使用filter_var()傳遞參數? – lvil

+0

認爲你可以使用filter_var_array($ data,$ args); – Elby

+1

正如我從php.net可以看到的filter_var一樣,但對於很多變量。它仍然在FILTER_CALLBACK選項中使用帶有ONE用戶定義變量的filter_var。 – lvil

相關問題