返回仅包含另一个数组中键名的数组值

5

我有两个数组,看起来像是这样的:

$fields = array('id', 'name', 'city', 'birthday', 'money');

$values = array('id' => 10,    
    'name' => 'Jonnas',   
    'anotherField' => 'test',
    'field2' => 'aaa',
    'city' => 'Marau', 
    'field3' => 'bbb',
    'birthday' => '0000-00-00',
    'money' => 10.95
);

是否有PHP内置函数,可以检索填充了$fields数组中指定键(id、name、city、birthday、money)的数组?

我期望的返回结果是这样的:

$values2 = array(
    'id' => 10,
    'name' => 'Jonnas',
    'city' => 'Marau',
    'birthday' => '0000-00-00',
    'money' => 10.95
);

附注:我只需要内置函数。


没有像您所寻找的那样的内置函数...您必须同时使用循环和“用于键的内置函数”。 - thumber nirmal
更多重复问题:https://dev59.com/xU3Sa4cB1Zd3GeqPwIw7,http://stackoverflow.com/q/4780861/218196,https://dev59.com/amXWa4cB1Zd3GeqPOJAr ... 完整列表:http://stackoverflow.com/search?q=array_intersect_key+is%3Aanswer。 - Felix Kling
2个回答

13
$values2 = array_intersect_key($values, array_flip($fields));

如果键必须始终按 $fields 的顺序返回,请改用简单的 foreach 循环:

$values2 = array();
foreach ($fields as $field) {
    $values2[$field] = $values[$field];
}

我的实际数组具有浮点值,因此array_flip函数会引发以下错误:“只能翻转STRING和INTEGER值!” - fonini
@fonini:在你的例子中,$fields数组没有浮点数值。 - Felix Kling
@FelixKling 对此很抱歉。 - fonini
@fonini:好的,请提供一个合适的例子。如果$fields确实是一组键的数组,那么这些值(字段/键)怎么可能是浮点数呢?正如您已经注意到的那样,浮点数不能作为键。 - Felix Kling
@fonini:这对$fields数组没有任何影响。我认为你将array_flip应用于了错误的数组。鉴于你问题中的示例,这个答案完全可以正常工作。 - Felix Kling
@FelixKling 伙计,你说得对!我今天没喝够咖啡。谢谢! - fonini

2

array_intersect_key — 使用键名比较计算数组的交集

<?php
$fields = array('id', 'name', 'city', 'birthday');

$values = array('id' => 10,    
    'name' => 'Jonnas',   
    'anotherField' => 'test',
    'field2' => 'aaa',
    'city' => 'Marau', 
    'field3' => 'bbb',
    'birthday' => '0000-00-00'
);

var_dump(array_intersect_key($fields, array_flip($values)));
?>

我有点晚了才发布答案... - Tony Stark
你仍然需要翻转这些字段... - Baba
+1 对于快速的更正... - Baba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接