我正在寻找一个像这样的数组函数:
$myArray = array(
'apple'=>'red',
'banana'=>'yellow',
'lettuce'=>'green',
'strawberry'=>'red',
'tomato'=>'red'
);
$keys = array(
'lettuce',
'tomato'
);
$ret = sub_array($myArray, $keys);
其中$ ret是:
array(
'lettuce'=>'green',
'tomato'=>'red'
);
A自己写下来没有问题,我想避免使用foreach循环并采用内置函数或内置函数的组合。在我看来,这是一个通用的常见数组操作 - 如果循环是唯一的选择,我会感到惊讶。
答案 0 :(得分:39)
这有效:
function sub_array(array $haystack, array $needle)
{
return array_intersect_key($haystack, array_flip($needle));
}
$myArray = array(
'apple'=>'red',
'banana'=>'yellow',
'lettuce'=>'green',
'strawberry'=>'red',
'tomato'=>'red'
);
$keys = array(
'lettuce',
'tomato'
);
$ret = sub_array($myArray, $keys);
var_dump($ret);
答案 1 :(得分:6)
您可以使用array_intersect_key,但它使用带键和值的第二个数组。它使用密钥计算数组的交集
<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan' => 8);
$array3 = array('green' => '', 'blue' => '', 'yellow' => '', 'cyan' => '');
$array4 = array('green', 'blue', 'yellow', 'cyan');
var_dump(array_intersect_key($array1, $array2));
var_dump(array_intersect_key($array1, $array3));
var_dump(array_intersect_key($array1, $array4));
?>
以上示例将输出:
array(2) {
["blue"]=>
int(1)
["green"]=>
int(3)
}
array(2) {
["blue"]=>
int(1)
["green"]=>
int(3)
}
array(0) {
}
答案 2 :(得分:0)
$ret = array_filter($myArray, function ($key) { return in_array($key, $keys); }, ARRAY_FILTER_USE_KEY);
答案 3 :(得分:0)
单线:
$subArray = array_intersect_key($items, array_fill_keys($keys, 1));
示例:
<?php
$items = [ 'product_id' => 1234, 'color' => 'green', 'qty' => 5, 'desc' => 'Shirt' ];
$keys = [ 'product_id', 'desc' ];
$subArray = array_intersect_key($items, array_fill_keys($keys, 1));
var_dump($subArray);
产生:
array(2) {
["product_id"]=>
int(1234)
["desc"]=>
string(5) "Shirt"
}
适用于: