2011-12-28 68 views
2

我需要將鑰匙從陣列相結合,與值:「Array_combine」關聯數組

$a = array(4=>2000,5=>5000,7=>1000,3=>5000); 
$b = arrray(array(0=>0,1=>4,2=>10,3=>1000),array()...) 

這是我寫的東西(不工作):

$keys = array_keys($a); 
foreach ($b as $k => $v) { 
array_combine($keys,$v); 
} 

我希望得到的是:

$c = array(array(4=>0,5=>4,7=>10,3=>1000),array(4=>...)); 

回答

1

由於b中有多個陣列,你只需要做b的簡單的迭代:

$a = array(4=>2000,5=>5000,7=>1000,3=>5000); 
$b = array(array(0=>0,1=>4,2=>10,3=>1000), array(0=>0,1=>4,2=>10,3=>1000)); 

$keys = array_keys($a); 
$length = count($keys); 
$c = array(); 
foreach($b as $sub) { 
    if(!is_array($sub)) { 
     $sub = array(); 
    } 

    $c[] = array_combine(array_pad($keys, count($sub), NULL), array_pad(array_values($sub), $length, NULL)); // Pad removes the possibility of a warning 
} 

print_r($c); 

你有正確的想法與array_keys($a)array_combine()。您需要進入array_combine()的另一個參數是值array_values($b)。但是由於b中有多個數組,你需要遍歷每個數組。作爲b或b的任何子數組中有更多或更少的鍵/值對的故障保護,我添加了array_pad()以確保傳遞到array_combine()的兩個數組的長度相等,以便PHP不會「 t抱怨。

+0

它遺漏邊緣情況下'$ sub'不是一個數組(如果你想防止警告,完整)。此外,我建議你用NULL值而不是0填充數組。我已經使用匿名回調函數使關鍵字成爲回調的一部分。這也允許在任何值上使用它。請參閱[我的答案](http://stackoverflow.com/a/8660676/367456)。 – hakre 2011-12-28 20:10:32

+0

@hakre我認爲它暗示'$ sub'總是一個數組,但如果不是這樣的話,那麼它很容易適應(儘管我喜歡你的回調)。 – 2011-12-28 20:15:58

3

您的代碼幾乎當場就:

$final=array(); 
$keys = array_keys($a); 
foreach ($b as $v) { 
    $final[]=array_combine($keys,$v); 
} 
2

,因爲你需要的$b陣列中的每個元素上運行相同的功能:

$a = array(4=>2000,5=>5000,7=>1000,3=>5000); 
$b = array(array(0,4,10,1000), array(0,4,10,40)); 

,您可以利用的array_map有回調功能。回調函數然後使用array_combine將您的密鑰分配給值。

由於array_combine需要有操作鍵,但回調只有值作爲輸入,我創建了一個函數,根據陣列創建實際的回調函數,這些鍵將用於操作array_combine

由於數組可以包含任何值,因此可以採取一些預防措施。空數組不會在所有被處理,對於特定鍵遺漏值將被通知,NULL

$keyed = function($array) 
{ 
    $keys = array_keys($array); 

    // no keys, nothing to combine 
    if (!$len = count($keys)) { 
     return function($v) {return array();}; 
    } 

    // default values are all NULL 
    $pad = array_fill(0, $len, NULL); 
    return function($values) use ($keys, $pad, $len) 
    { 
     // if input is not array, make it an empty array 
     !is_array($values) && $values = array(); 
     return array_combine($keys, array_slice($values + $pad, 0, $len)); 
    }; 
}; 

$keyed現在是匿名函數將返回回調函數依賴於它array_map是爲數組鍵輸入參數:

$c = array_map($keyed($a), $b); 

從5.3版本開始,PHP中提供了匿名函數。

輸出:

array(2) { 
    [0]=> array(4) { 
    [4]=> int(0) 
    [5]=> int(4) 
    [7]=> int(10) 
    [3]=> int(1000) 
    } 
    [1]=> array(4) { 
    [4]=> int(0) 
    [5]=> int(4) 
    [7]=> int(10) 
    [3]=> int(40) 
    } 
}