PHP:是否有任何本机等效的compact()适用于数组

时间:2012-02-09 09:33:12

标签: php

我想知道是否有任何本地方法可以使用较小的数组从大数组中提取一组值及其键键名即可。

compact()对单独的变量执行此操作,但不对数组执行此操作:

$foo='foo';
$bar='bar';

print_r(compact('foo','bar'));
// or
print_r(compact(array('foo','bar'));

// Prints:
// Array(
//  [0] => foo,
//  [1] => bar
// )

到目前为止,我一直使用foreach循环,但我开始怀疑是否存在更简单的方法。我已经浏览了PHP文档的数组函数部分,但仍然觉得如果我错过了某些内容,我会尝试询问。

2 个答案:

答案 0 :(得分:3)

总结一些比我预期更长的内容,您感兴趣的功能可能是array_flip()array_intersect_key()


我希望我能正确理解你想要的东西。你想要一个变量名数组,其中变量本身包含数组键,你想搜索一个更大的数组来获取这些键吗?

这样做你想要的吗?我没有对它进行基准测试,它可能会慢一点。

$foo = 'foo2';
$bar = 'bar3';

$array = array(
    'foo1' => 1,
    'foo2' => 2,
    'foo3' => 3,
    'foo4' => 4,
    'bar1' => 5,
    'bar2' => 6,
    'bar3' => 7,
    'bar4' => 8
);

$keys = array(
    'foo',
    'bar'
);

$extract = array_intersect_key($array, array_flip(compact($keys)));

var_dump($extract);

输出:

array
  'foo2' => int 2
  'bar3' => int 7

修改
根据Gordons的评论,如果使用compact将变量名称用作键是无关紧要的,则可以使用以下代码替换。

$keys = array(
    'foo2',
    'bar3'
);

$extract = array_intersect_key($array, array_flip($keys));

您可以通过稍微不同地定义键组来进一步减少代码,并且无需array_flip()

$keys = array(
    'foo2' => null,
    'bar3' => null
);

$extract = array_intersect_key($array, $keys);

答案 1 :(得分:1)

要使其与compact一起使用,您可以使用以下内容:

function array_subset(array $array, $keys)
{
    extract($array);
    return compact(array_slice(func_get_args(), 1));
}

由于extractcompact在函数范围内使用当前符号表,因此不会对调用者范围造成任何污染。然后将这样调用(demo):

$subset = array_subset($source, 'foo', 'bar', 'baz');

array_intersect_key可能就是你真正追求的目标。