2013-04-25 62 views
-1

我有兩個數組。一個包含數據,另一個包含密鑰。所以,我有基於數組中的給定鍵提取數組部分

$data = array(
    'name' => array('label' => 'Name:', 'value' => 'Genghis'), 
    'age' => array('label' => 'Age:', 'value' => '67'), 
    'weigh' => array('label' => 'Weigh in Kgs:', 'value' => '78') 
); 

$keys = array('name', 'age'); 

現在我想只提取的$datanameage元素。有些事情是這樣的。

$extracted = somemethod($data, $keys); 
var_export($extracted); 

輸出應該是這樣的。

array(
    'name' => array(
     'label' => 'Name:', 
     'value' => 'Genghis', 
    ), 
    'age' => array(
     'label' => 'Age:', 
     'value' => '67', 
    ), 
) 

我該怎麼做?

回答

3

我會用一個array_intersect_key()功能是這樣的:

$data = array(...); // initial array as described 
$retained_keys = array('name' => 'value not used', 'age' => 'value not used'); 

$filtered_array = array_intersect_key($data, $retained_keys); 
+0

我喜歡這樣的解決方案,但我會翻轉OPs'$ keys'數組。 '$ retain_keys = array_flip(array('name','age'));' – nickb 2013-04-25 17:12:16

+0

@nickb好的建議是否已經定義了$ keys數組並用於其他目的。我只是想,如果僅僅用於這個單一用途,他可能會簡單地用我的'$ retained_keys'定義替換他的'$ keys'行。 – 2013-04-25 17:15:29

+0

我發現這已經在手冊。但不想使用它,因爲它需要'array_flip'。 – 2013-04-25 17:21:06

2

遍歷所有的鍵,抓住數組值,並返回它們:

function somemethod($data, $keys) { 
    $return = array(); 
    foreach($keys as $k) { 
     $return[$k] = isset($data[$k]) ? $data[$k] : null; 
    } 
    return $return; 
} 

當未找到場上面增加了「NULL」。您可以修改foreach循環只跳過鍵時,它不是$data數組中發現,像這樣:

function somemethod($data, $keys) { 
    $return = array(); 
    foreach($keys as $k) { 
     if(isset($data[$k])) { 
      $return[$k] = $data[$k]; 
     } 
    } 
    return $return; 
} 

編輯:要延長邁克·布蘭特的回答,array_intersect_key()可以用array_flip()在函數中使用以達到所需的輸出:

function somemethod($data, $keys) { 
    $keys = array_flip($keys); 
    return array_intersect_key($data, $keys); 
} 

是,它使用array_flip(),但原來$keys陣列保持未修改,作爲數組的一個副本是什麼被翻轉。所以,你還是會調用這個函數:

$extracted = somemethod($data, array('name', 'age')); 
1

不完全是繁重的寫

$extracted = array(); 
foreach($keys as $key) { 
    if (isset($data[$key])) 
     $extracted[$key] = $data[$key]; 
}