PHP数组匹配

时间:2010-12-09 19:17:37

标签: php arrays

我是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开发人员的意见。

由于

3 个答案:

答案 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将仅包含匹配的数组