如何搜索数组以知道数组中是否有键=>值?
例如在下面的数组中,我想知道[uid] => 10是否存在。
<>之前
Array (
[0] => Array (
[name] => a
[uid] => 1
)
[1] => Array (
[name] => b
[uid] => 2
)
)
in_array
和array_search
可以很好地嵌套数组:
$a = array(
array('id' => 10),
array('id' => 11),
array('id' => 12),
array('id' => 13),
array('id' => 14),
);
var_dump(in_array(array('id' => 14), $a)); // true
var_dump(in_array(array('id' => 99), $a)); // false
var_dump(array_search(array('id' => 14), $a)); // 4
var_dump(array_search(array('id' => 99), $a)); // false
$foundAt = null;
foreach($yourArray as $index => $pair){
if($pair['uid']===10){
$foundAt = $index;
break;
}
}
echo $foundAt;
$foundAt
如果没有找到则为null
,如果找到则为整数。
没有专门的内置函数。我只能想到array_walk
在这里是有用的。
foreach($array as $index => $data){
if ($data['uid'] === 10){
echo $index;
break;
}
}
当你编辑你的问题时,每个元素里面有更多的值要测试,array_intersect_assoc
浮现在脑海中。它处理每个元素都不能包含您正在查找的键的情况。
基本上:如果元素和指针的交集是指针,则元素匹配。
这个比较需要应用于每个元素,例如foreach
。包装成一个函数,如果没有找到,函数可以返回键和FALSE
:
function array_search_array(array $haystack, array $needle)
{
foreach($haystack as $key => $element)
{
if ($needle == array_intersect_assoc($element, $needle))
return $key;
}
return FALSE;
}
我必须承认,函数的命名不是最优的。演示如果您需要搜索多个值(无论$needle
中这些值的顺序如何),这也可以工作。
只要您只需要搜索单个键/值对,则应该在访问它之前检查该键。这是对Tom回答中的代码示例的修改:
$foundAt = null;
foreach($yourArray as $index => $pair)
{
if(isset($pair['uid']) && $pair['uid'] === 10)
{
$foundAt = $index;
break;
}
}
echo $foundAt;
没有内置函数,但是你可以使用这样的函数:
if (count(array_intersect($your_array, array("uid" => 10))) > 0)
// pair exists
分解上面的语句:
用你喜欢的键和值创建一个数组:
$array_to_search = array("uid" => 10);
使用array_intersect()
获取数组的交集:
$result = array_intersect($your_array, $array_to_search);
计算结果元素:
if (count($result) > 0)
// pair exists