我有以下数组(下面称为$example_array
):
array(3) {
["id"]=> string(4) "123"
["name"]=>
array(1) {
["first"]=> string(3) "pete"
["last"]=> string(3) "foo"
}
["address"]=>
array(1) {
["shipping"]=>
array(1) {
["zip"]=> string(4) "1234"
["country"]=> string(4) "USA"
}
}
}
我想要一个函数,我可以对这样的数组运行并寻找匹配。以下是我希望能够执行的搜索:
// These should return true:
search( $example_array, array( 'id' => '123' ) );
search( $example_array, array( 'name' => array( 'first' => 'pete' ) );
search( $example_array, array( 'address' => array( 'shipping' => array( 'country' => 'USA' ) ) );
// These don't have to return true:
search( $example_array, array( 'first' => 'pete' ) );
search( $example_array, array( 'country' => 'USA' ) );
我可以使用PHP内部函数,还是我必须自己编写代码?
答案 0 :(得分:7)
function search($array, $b) {
$ok = true;
foreach ($b as $key => $value) {
if (!isset($array[$key])) { $ok = false; break; }
if (!is_array($value))
$ok = ($array[$key] == $value);
else
$ok = search($array[$key], $value);
if ($ok === false) break;
}
return $ok;
}
这是test script。
答案 1 :(得分:1)
希望这个功能有所帮助:
public function matchArray(&$arrayToSearch, $valueToMatch = array()){
if(!is_array($valueToMatch))
$valueToMatch = array($valueToMatch);
$exists = false;
$indexToMatch = array_keys($valueToMatch);
foreach($indexToMatch as $ind){
if(array_key_exists($ind, $arrayToSearch)){
$valToMatch = $valueToMatch[$ind];
$value = $arrayToSearch[$ind];
$valType = gettype($value);
$valToMatch = $valueToMatch[$ind];
if($valType == gettype($valToMatch) || is_numeric($valToMatch)){
if($valType == 'array'){
$exists = $this->matchArray($value, $valToMatch);
} else if(($valType == 'string' || is_numeric($valToMatch)) && $valToMatch == $value) {
$exists = true;
} else {
$exists = false;
break;
}
}
}
}
return $exists;
}
答案 2 :(得分:0)
没有内置可以做你想做的事,iirc。
以下是array_walk
的<未经测试的版本:
function search($data,$match) {
return array_walk($match, function($v,$k) use ($data) {
if (isset($data[$k])){
if (is_array($v)) return search($data[$k],$v);
return ($v == $data[$k]);
});
return false;
}
它有点简洁(可以用?:
做得更好),但可能不太可读。 Lambdas是php的一个很好的补充!
这是另一种可能的解决方案,但看似无效(你应该确定基准):
function search($d,$m) {
return is_empty(array_diff_assoc(array_intersect_assoc($d,$m), $m));
}
如果使用的内置函数不是递归的话,它可能无效。