2016-09-20 61 views
2

PHP函數array_map(...)需要一個回調爲第一參數(或nullcreating an array of arrays)和數組參數的可變數量,例如:如何在PHP中使用array_map(...)的數組數組?

$foo => array_map(null, $bar, $buz); 

現在我的情況下,在這裏我需要傳遞給array_map(...)可變陣列數量。我無法對此進行硬編碼,因爲array_map(...)的輸入數組是動態生成的。

function performSomeLogicAndGetArgumentsForMyFunction() { 
    ... 
    return ['bar' => [...], 'buz' => [...]]; 
} 
$foo = array_map(null, performSomeLogicAndGetArgumentsForMyFunction()); 

它不以這種方式工作,因爲array_map(...)預計可變數目的陣列的和不陣列的陣列。

有沒有解決方案呢? 如何保持通話的靈活性並將可變數量的參數傳遞給array_map(...)(它也適用於所有其他可變參數函數我無法操縱。)

+1

在'call_user_func_array看看()' – Rizier123

+0

謝謝你們!是的,當然,這只是一個數組,可以很容易地解壓縮/迭代。 – automatix

+0

對不起,我制定了錯誤的問題。問題實際上是用「重新傳遞」參數,例如,到'array_map(...)'。我剛剛編輯了這個問題。 – automatix

回答

-2

作爲最後的手段,使用eval

//build you array of array variable names with the dynamic content coming in. 
$arrays = ['$foo', '$bar', '$baz']; 

$str = implode(', ', $arrays); 
eval("\$map = array_map(null, $str);"); 

print_r($map); 

謹防從未未消毒的輸入發送到EVAL。

See it working

+0

這是已經過測試的工作代碼,它回答了將可變數量的未知數組傳遞給array_map函數的問題。如果你投票至少留下解釋原因的評論。 – dlporter98

0

你返回數組的數組,並要映射在這些陣列的最裏面。您可以使用argument unpacking此:

print_r(
    call_user_func_array(
     'array_map', 
     array_merge(array ('say'), arrays()) 
    ) 
); 

See it online at 3v4l.org.

function say($n, $m) { 
    return "The number $n is called $m in Spanish"; 
} 
function arrays() { 
    return [ 
     [ 1, 2, 3 ], 
     [ 'uno', 'dos', 'tres' ], 
    ]; 
} 
print_r(
    array_map('say', ...arrays()) 
); 

See it online at 3v4l.org.

另外,作爲一個衡量的運行時間成本在RFC提到你可以使用call_user_func_array這些模式都可以實現可變形式的通用方法。例如,模擬vsprintf可以使用:

sprintf('%s %s', ...['Hello', 'World']); 
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World'])); 
相關問題