2013-04-25 75 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]; 
}