我是PHP的半新手,正在寻找匹配数组的好方法。请注意,我将在这里用python语法编写我的数组,因为它更容易键入,但我在PHP中工作。
我有一个类似这样的数组:{3:4,5:2,6:2}
然后我有一个数组数组,其中inners数组具有与上面数组相同的基本形式。我想编写一个函数来返回与给定数组匹配的所有数组,忽略额外的值。
所以我希望上面的数组匹配{3:4,6:2,5:2}或{3:4,5:2,6:2,7:2}
但不是{3:4,5:2}或{3:4,5:2,6:3}
我可能会让它工作,但我怀疑代码会那么棒。所以我喜欢更好的PHP开发人员的意见。
由于
答案 0 :(得分:3)
你想要array_intersect或array_intersect_key
$a = array(1 => 11, 3 => 33, 2 => 22);
$b = array(3 => 33, 5 => 55, 2 => 22, 1 => 11);
if (array_intersect_key($a, $b) == $a)
echo "b contains a";
答案 1 :(得分:0)
我不认为php中有预定义的功能可以帮助解决这类问题。只需遍历所有数组,找到符合条件的数组。
function query( $query, $arrayOfArrays) {
$ret = array();
foreach( $arrayOfArrays as $array) {
if( matches( $array, $query) ) {
$ret[] = $array;
}
}
return $ret;
}
function matches( $array, $query) {
foreach( $query as $key => $value) {
if( !isset( $array[$key]) || $array[$key] != $value) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
如果你有PHP 5.3,那么你可以使用一个闭包和array_filter
:
// array to test against
$test = array(
3 => 4,
5 => 2,
6 => 2
);
// array of arrays you need to check
$subjects = array(
array(3 => 4, 5 => 2, 6 => 2),
array(3 => 4, 6 => 2, 5 => 2, 7 => 2),
array(3 => 4, 5 => 2),
array(3 => 4, 5 => 2, 6 => 3),
);
// make $test available within the filter function with use
$result = array_filter($subjects, function($subject) use ($test)
{
// making use of array_intersect_key
// note that $subject must be the first parameter for this to work
return array_intersect_key($subject, $test) == $test;
});
$result
将仅包含匹配的数组