2016-09-20 71 views
1

我正在用php構建一個pdf,並注意到我的字符串沒有工作,因爲它們是UTF-8格式。 utf8_decode($str)工作正常,但我有很多變數,我將不得不這樣解碼。我的代碼看起來是這樣的:如何輕鬆地覆蓋/更改多個php變量

function makePDF(titleStr, bodyStr, headerStr, and more...) 
{ 

    //TO-DO 

    $pdf->Cell(20, 6, $titleStr, 1, 1, 'L', false); 
    $pdf->Cell(15, 6, $bodyStr, 1, 1, 'L', true); 
    $pdf->Cell(50, 6, $headerStr, 1, 1, 'R', false); 
} 

我想找到一種方法,他們都不必爲每個變量做這個或改變任何其他代碼在一個循環或東西立刻解碼,我已經有了:

$titleStr = utf8_decode($titleStr); 
$bodyStr = utf8_decode($bodyStr); 
...and so on 

任何想法如何更容易地做到這一點?

+0

你有數組中的字符串變量嗎?然後你可以在一個循環內做到這一點。 – KhorneHoly

+1

如何擴展任何$ pdf的類並重寫Cell()方法。那麼你可以在調用父方法之前解碼字符串? – Andy

+0

謝謝,我沒想到!這將工作! –

回答

1

您可以使用func_get_args()來讀取所有函數的參數以檢索它們,使用array_map()來應用UTF8解碼,然後list()將它們讀回到簡單的字符串變量中。

<?php 

function makePDF($titleStr, $bodyStr, $headerStr) 
{ 
    $args = func_get_args(); 

    $args = array_map(function($args){ 
     return utf8_decode($args); 
    }, $args); 

    list($titleStr, $bodyStr, $headerStr) = $args; 

    var_dump($titleStr); 
    var_dump($bodyStr); 
    var_dump($headerStr); 
} 

makePDF('foo', 'bar', 'baz'); 

輸出:

string(3) "foo" 
string(3) "bar" 
string(3) "baz" 

您將需要複製/粘貼你的方法簽名改成list()電話,但這是相當簡單的。


爲了好玩,如果你想跳過複製/粘貼步驟中,您可以在func_get_args()開關get_defined_vars()和使用variable variables重新分配的參數:

<?php 

function makePDF($titleStr, $bodyStr, $headerStr) 
{ 
    $args = get_defined_vars(); 

    $args = array_map(function($args){ 
     return utf8_decode($args) . rand(0,10); 
    }, $args); 

    foreach($args as $key => $arg){ 
     // The two $$ show that this is a variable variable. 
     $$key = $arg; 
    } 

    var_dump($titleStr); 
    var_dump($bodyStr); 
    var_dump($headerStr); 
} 

makePDF('foo', 'bar', 'baz'); 
string(4) "foo5" 
string(4) "bar5" 
string(4) "baz9" 

*我在array_map()可調用函數中添加了rand(),以證明這個任務實際發生在這裏。

+0

謝謝,我真的很喜歡你的答案,因爲它不僅解決了我的問題,而且我也學到了很多:) –