使用array_search()检查值是否存在于数组中

3
如果array_search()可能会返回0作为键,那么使用这个函数(或任何PHP函数;如果有更好的方法,请分享)测试数组中是否存在元素的最佳方法是什么?
我试图做这个:
if(array_search($needle, $haystack)) //...

但是,如果$needle是数组中的第一个元素,那么当然会返回false。我想我要问的是,是否有一些技巧可以在这个if语句中使其按照我的意愿运作?我尝试过以下方法,但都没有奏效:

$arr = array(3,4,5,6,7);

if(array_search(3, $arr) != false)  //...

if(array_search(3, $arr) >= 0)  //...

感谢您的帮助。
3个回答

15

这是方法:

if(array_search(3, $arr) !== false)

请注意使用 === PHP运算符,称为恒等(在这种情况下不是不同的)。您可以在官方文档中阅读更多信息。您需要使用它,因为使用等于运算符无法区分0和false(或null或''也一样)。

如果找到匹配项并想使用整数值,则更好的解决方案是:

if (($pos = array_search(3, $arr)) !== false)
{
   // do stuff using $pos
}

1
天啊,那是有史以来最快的回答。 - Nick Rolando
@Shredder 很高兴你喜欢它 :p - Aurelio De Rosa
第一次我不得不使用这个运算符。耶! - Nick Rolando
这是更好的解决方案,因为它允许在检查后继续使用密钥。不知道为什么这个不被接受。 - Alari Truuts

8

除了使用===!==,您还可以使用in_array作为替代方法:

if (in_array($needle, $haystack))

好的替代方案。唯一的缺点是为了获取位置你必须调用另一个函数。 - Aurelio De Rosa
啊!这就是我在寻找的东西 :) 谢谢! - Nick Rolando
@AurelioDeRosa 不需要密钥 :) - Nick Rolando
没问题 :) 但你仍然应该查看@Aurelio的答案。有许多情况下需要使用===!==运算符。理解它们是任何PHP开发人员的要求。 - Abhi Beckert
我肯定地做到了,并为他的回答感到高兴!就在这种情况下,你的回答已经足够了。 - Nick Rolando

0
作为 ===!==in_array() 的替代方案,您可以使用 array_flip()
$arr = [3,4,5,6,7];

$rra = array_flip($arr);

if( $rra[3] !== null ):

  var_dump('Do something, '.$rra[3].' exists!');

endif;

这并不比被接受的答案少。但它确实可以让你以一种非常易读的方式获取位置和存在。

我们想要找出 int 3 是否在原始数组 $arr 中:

array (size=5)
0 => int 3
1 => int 4
2 => int 5
3 => int 6
4 => int 7

array_flip函数创建一个新的数组($rra),并交换键值对:

array (size=5)
3 => int 0
4 => int 1
5 => int 2
6 => int 3
7 => int 4

现在我们可以通过array_key_existsisset或将$rra[3]放入if语句中来验证int 3是否存在于$rra中,这将成为一个关键点(或不是)。

由于我们要查找的值可能具有数组键ID 0,因此我们需要与null进行比较,而不能依赖于将0评估为false

如果使用情况需要,您还可以对原始数组进行更改,因为如果$rra[3]不是null,则$rra[3]将返回原始数组中该值的键(在本例中为位置0)。

if ( $rra[3] !== null ):
  // evaluates to: unset( $array[0] );
  unset( $arr[ $rra[3] ] );
endif;

如果您正在使用关联数组,这个操作同样适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接