文字

in_array

(PHP 4, PHP 5, PHP 7)

in_array检查数组中是否存在某个值

说明

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

haystack 中搜索 needle,如果没有设置 strict 则使用宽松的比较。

参数

needle

待搜索的值。

Note:

如果 needle 是字符串,则比较是区分大小写的。

haystack

这个数组。

strict

如果第三个参数 strict 的值为 TRUE in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。

返回值

如果找到 needle 则返回 TRUE ,否则返回 FALSE

更新日志

版本 说明
4.2.0 在 PHP 版本 4.2.0 之前,needle 不允许是一个数组。

范例

Example #1 in_array() 例子

<?php
$os 
= array( "Mac" "NT" "Irix" "Linux" );
if (
in_array ( "Irix" $os )) {
    echo 
"Got Irix" ;
}
if (
in_array ( "mac" $os )) {
    echo 
"Got mac" ;
}
?>

第二个条件失败,因为 in_array() 是区分大小写的,所以以上程序显示为:

Got Irix

Example #2 in_array() 严格类型检查例子

<?php
$a 
= array( '1.10' 12.4 1.13 );

if (
in_array ( '12.4' $a true )) {
    echo 
"'12.4' found with strict check\n" ;
}

if (
in_array ( 1.13 $a true )) {
    echo 
"1.13 found with strict check\n" ;
}
?>

以上例程会输出:

1.13 found with strict check

Example #3 in_array() 中用数组作为 needle

<?php
$a 
= array(array( 'p' 'h' ), array( 'p' 'r' ),  'o' );

if (
in_array (array( 'p' 'h' ),  $a )) {
    echo 
"'ph' was found\n" ;
}

if (
in_array (array( 'f' 'i' ),  $a )) {
    echo 
"'fi' was found\n" ;
}

if (
in_array ( 'o' $a )) {
    echo 
"'o' was found\n" ;
}
?>

以上例程会输出:

'ph' was found
  'o' was found

参见

  • array_search() - 在数组中搜索给定的值,如果成功则返回相应的键名
  • isset() - 检测变量是否设置
  • array_key_exists() - 检查给定的键名或索引是否存在于数组中

用户评论:

[#1] splogamurugan at gmail dot com [2015-11-06 11:49:58]

var_dump(in_array('invalid', array(0,10,20))); 
The above code gives true since the 'invalid' is getting converted to 0 and checked against the array(0,10,20)

but var_dump(in_array('invalid', array(10,20)));  gives 'false' since 0 not there in the array

[#2] dazero0 dot ls at gmail dot com [2015-09-24 10:43:31]

I would like to add something to beingmrkenny at gmail dot com comparison post. After debugging a system, i discovered a security issue in our system and his post helped me find the problem.

In my additional testing i found out that not matter what you search for in an array, except for 0 and null, you get true as the result if the array contains true as the value.

Examples as php code :

<?php
$a 
= ['a'32true'x' => y];
var_dump(in_array(25$a)); // true, one would expect false
var_dump(in_array('ggg'$a)); // true, one would expect false

var_dump(in_array(0$a)); // false
var_dump(in_array(null$a)); // false
?>
 

Such the best practice in our case is to use strict mode. Which was not so obvious.

[#3] Kris Spencer [2015-06-08 17:35:16]

if using in_array to evaluate a boolean in a _GET or _POST, be sure to put single quotes around your "haystack values" or you will get a false result.

example of false/incorrect result:
[whatever.php?var=1 -- $_GET['var'] is 1]

if(!in_array($_GET['var'], array(0, 1), true)){
    echo 'not in array';
}
else{
    echo 'is in array';
}

output is "not in array" even though 1 === 1. Same is true without strict evaluation.

example of correct evaluation/result:
[whatever.php?var=1 -- $_GET['var'] is 1]

if(!in_array($_GET['var'], array('0', '1'), true)){
    echo 'not in array';
}
else{
    echo 'is in array';
}

output is now correct; "is in array".

[#4] Harry Willis [2015-01-24 11:39:20]

Kelvin's case-insensitive in_arrayi is fine if you desire loose typing, but mapping strtolower onto the array will (attempt to) cast all array members to string. If you have an array of mixed types, and you wish to preserve the typing, the following will work:

<?php
function in_array_ci($needle, array $haystack$strict false) {
    foreach (
$haystack as $element) {
        if (
gettype($needle) == 'string' && gettype($element) == 'string') {
            if (!
strcasecmp($needle$element)) {
                return 
true;
            }
        }
        elseif (
$strict) {
            if (
$needle === $element) {
                return 
true;
            }
        }
        else {
            if (
$needle == $element) {
                return 
true;
            }
        }
    }

    return 
false;
}
?>

[#5] Chaya Cooper [2014-09-29 22:33:59]

To identify all instances of $needle when both $needle and $haystack are arrays, combine in_array() with a loop through the array  of needles.

I've posted a functional example of it here: http://sandbox.onlinephpfunctions.com/code/930385800c30595129cefb87cfa7eec9d69dce08

$needles = array('John', 'Alex');
$haystack = array('John','Alexander','Kim', 'Michael');

    foreach ($needles as $needle) {
        // Displays var name & value currently searching for) 
        echo '$needle: '.$needle;
        if (in_array($needle, $haystack) ) {
            echo ', True; ';
        }
       else {
            echo ', False; ';
        }
    }

Result is:
$needle: John, True; $needle: Alex, False;

[#6] Chaya Cooper [2014-09-29 22:32:27]

To identify all instances of $needle when both $needle and $haystack are arrays, combine in_array() with a loop through the array  of needles.

I've posted a functional example of it here: http://sandbox.onlinephpfunctions.com/code/930385800c30595129cefb87cfa7eec9d69dce08

$needles = array('John', 'Alex');
$haystack = array('John','Alexander','Kim', 'Michael');

    foreach ($needles as $needle) {
        // Displays var name & value currently searching for) 
        echo '$needle: '.$needle;
        if (in_array($needle, $haystack) ) {
            echo ', True; ';
        }
       else {
            echo ', False; ';
        }
    }

Result is:
$needle: John, True; $needle: Alex, False;

[#7] i dot pinz1 at gmail dot com [2014-05-15 11:33:06]

I have noted some strange behavior of the in_array() function if you have a hash like
$haystack=array (
'123'=>'some value',
'0125'=>'some value');

If I test now:
if (in_array('23',$haystack)) // here also TRUE is returned

I switched instead to 
if(isset($haystack['23'])) // which return correct FALSE

Maybe this helps others too.

[#8] what loose checking means [2014-01-20 05:03:50]

In a high-voted example, an array is given that contains, amongst other things, true, false and null, against which various variables are tested using in_array and loose checking.

It impossible to receive false as a return value from in_array using loose checking if your arrays contains both the constants true and false. You might understandably trip over this (or the inverse - passing boolean true to check against an array of e.g. non-empty strings), but it's certainly not counter intuitive and makes perfect sense.

[#9] manuel at sunred dot org [2014-01-15 21:00:51]

If you are looking for a faster in_array function but still need the strict feature with which the type of element will be considered the following simple function might help you.

<?php
function fast_in_array($needle, array $haystack$strict false)
{
    
$c count($haystack);
    if(
$strict !== true)
    {
        for(
$i 0$i $c$i++)
            if(
$haystack[$i] == $needle)
                return 
true;
    }
    else
    {
        for(
$i 0$i $c$i++)
            if(
$haystack[$i] === $needle)
                return 
true;
    }
    return 
false;
}
?>

[#10] rolf dot dergham dot public at gmail dot com [2014-01-13 01:02:20]

Watch out for this:

<?php

print_r
( (int) in_array('hello',array( => 0)) );

?>


returns 1

Yes, it seems that is_array thinks that a random string and 0 are the same thing.
Excuse me, that's not loose checking, that's drunken logic.
Or maybe I found a bug?

[#11] Artur K [2013-08-21 07:52:21]

As an addition to beingmrkennys note:

<?php

var_dump
(in_array('012', array('12'))); //returns true
var_dump(in_array('012', array('12'), true)); //returns false

?>


Seems like PHP is making some cast. So use the strict parameter.

[#12] Fabian S [2013-08-01 14:52:52]

Robin's fast_in_array uses binary search, so the array has to be sorted before, using the regular sort function.

[#13] santi dot morel at gmail dot com [2013-05-22 21:43:31]

search in multidimensional array

    function in_multiarray($elem, $array) {
        foreach ($array as $key => $value) {
            if ($value==$elem){
                return true;
            }
            elseif(is_array($value)){
                if($this->in_multiarray($elem, $value))
                        return true;
            }
        }
        
        return false;
    }

[#14] Valerchik [2013-05-13 07:30:34]

Beware when using this function to validate user input:

$a = array('0' => 'Opt 1', '1' => 'Opt 2', '2' => 'Opt 3');
$v = 'sql injection';
var_dump(in_array($v, array_keys($a)));

This will result : true;

array_keys($a) will cast array keys to int instead of string !
then when in_array will compare it will cast  'sql injection' to int 0 !
Beware of this!

[#15] justinjohnmathews at gmail dot com [2013-03-05 13:34:24]

I think, "in_array" can be used with "range" function to check a number(dynamic value) is in between of other two numbers.

<?php 
    $i 
5// Dynamic value    
    
if (in_array(range(110), $i)) {
       echo 
'Your number is in between of range array';
    } 
?>

[#16] janis dot janovskis at gmail dot com [2012-02-28 23:03:28]

Since sometimes in_array returns strange results - see notes above.
I was able to find value in array by this quite a simple function;
<?php


function _value_in_array($array$find){
 
$exists FALSE;
 if(!
is_array($array)){
   return;
}
foreach (
$array as $key => $value) {
  if(
$find == $value){
       
$exists TRUE;
  }
}
  return 
$exists;
}

// Note
// You can't use wildcards and it does not check variable type
?>

[#17] rajeevroy15 at gmail dot com dot com [2011-11-30 04:51:07]

is_array function checks only array only and giving incorrect result with multi-dimensional arrays. 

Here is a custom function which will give the solution to check Array or Object and Checking of multi-dimensional arrays and objects as well. 

<?php 

function in_object($val$obj){

    if(
$val == ""){
        
trigger_error("in_object expects parameter 1 must not empty"E_USER_WARNING);
        return 
false;
    }
    if(!
is_object($obj)){
        
$obj = (object)$obj;
    }

    foreach(
$obj as $key => $value){
        if(!
is_object($value) && !is_array($value)){
            if(
$value == $val){
                return 
true;
            }
        }else{
            return 
in_object($val$value);
        }
    }
    return 
false;
}
?>

Usage  : 
<?php 

$array 
= array("a""b""c"=>array("x""y"=>array("p""q"=>"r")));

if(
in_object("r"$arrX)){
    echo 
"r is there ";
}else{
    echo 
"Its not there ";
}
?>

[#18] beingmrkenny at gmail dot com [2011-10-27 03:35:27]

Loose checking returns some crazy, counter-intuitive results when used with certain arrays. It is completely correct behaviour, due to PHP's leniency on variable types, but in "real-life" is almost useless.

The solution is to use the strict checking option.

<?php

// Example array

$array = array(
    
'egg' => true,
    
'cheese' => false,
    
'hair' => 765,
    
'goblins' => null,
    
'ogres' => 'no ogres allowed in this array'
);

// Loose checking -- return values are in comments

// First three make sense, last four do not

in_array(null$array); // true
in_array(false$array); // true
in_array(765$array); // true
in_array(763$array); // true
in_array('egg'$array); // true
in_array('hhh'$array); // true
in_array(array(), $array); // true

// Strict checking

in_array(null$arraytrue); // true
in_array(false$arraytrue); // true
in_array(765$arraytrue); // true
in_array(763$arraytrue); // false
in_array('egg'$arraytrue); // false
in_array('hhh'$arraytrue); // false
in_array(array(), $arraytrue); // false

?>

[#19] chris at axxis dot gr [2011-09-26 19:49:32]

It's funny how PHP has an in_array method, but not an in_object one. Here is a simple function which will check if a value can be found within an object.

<?php
  
// in_object method
  // to check if a value in an object exists.
  
function in_object($value,$object) {
    if (
is_object($object)) {
      foreach(
$object as $key => $item) {
        if (
$value==$item) return $key;
      }
    }
    return 
false;
  }
?>

  
This is very useful if an object has been created dynamically (especially from external code, which you don't control, as in an application-plugin, CMS, etc), and you don't know the object's properties. 
The above function will return the property, so you will be able to use it in your code later on.

Here is a very good basic example of how useful this function is!

<?php
  
class My_Class {
    function 
__construct($key$value) {
      
$this->$key $value;
      
// As you can see, this is a dynamic class, its properties and values can be unknown...
    
}
  }

  function 
in_object($value,$object) {
    if (
is_object($object)) {
      foreach(
$object as $key => $item) {
        if (
$value==$item) return $key;
      }
    }
    return 
false;
  }
  
  function 
manipulate_property($value,$object) {
    if (
$property in_object($value,$object)) {
      
// value found. I can now use this property.
      // I can simply echo'it (makes no sense, as I could instead simply echo "value")
      
echo "<br />I found the property holding this value: ".$object->$property
      
// or (here comes the good part)
      // change the property
      
$object->$property "This is a changed value!";
      echo 
"<br />I changed the value to: ".$object->$property
      
// or return it for use in my program flow
      
return $property;
    } else {
      echo 
"Value NOT FOUND!<br />";
      return 
false;
    }
  }
  
  
// imagine if some function creates the class conditionally...
  
if ( == 1) {
    
$class = new My_Class("property","Unchanged Value");
  } else {
    
$class = new My_Class("property","Some Other Value");
  }
  
  
// now let's check if the value we want exists, and if yes, let's have some fun with it...
  
$property manipulate_property("Unchanged Value",$class);
  if (
$property) {
    
$my_variable $class->$property;
    echo 
"<br />This is my variable now:".$my_variable
  } else 
$my_variable $some_other_variable;
?>


Just run it to see for yourself!

[#20] Lea Hayes [2011-08-04 17:40:20]

Determine whether an object field matches needle.

Usage Example:
---------------

<?php
$arr 
= array( new stdClass(), new stdClass() );
$arr[0]->colour 'red';
$arr[1]->colour 'green';
$arr[1]->state  'enabled';

if (
in_array_field('red''colour'$arr))
   echo 
'Item exists with colour red.';
if (
in_array_field('magenta''colour'$arr))
   echo 
'Item exists with colour magenta.';
if (
in_array_field('enabled''state'$arr))
   echo 
'Item exists with enabled state.';
?>


Output:
--------
Item exists with colour red.
Item exists with enabled state.

<?php
function in_array_field($needle$needle_field$haystack$strict false) {
    if (
$strict) {
        foreach (
$haystack as $item)
            if (isset(
$item->$needle_field) && $item->$needle_field === $needle)
                return 
true;
    }
    else {
        foreach (
$haystack as $item)
            if (isset(
$item->$needle_field) && $item->$needle_field == $needle)
                return 
true;
    }
    return 
false;
}
?>

[#21] Ray dot Paseur at Gmail dot com [2011-08-01 09:20:14]

Be VERY careful about testing for strings in arrays that might also contain integers.  In this snippet, the range() function turns the numeric values into integers, and loose data typing finds a match with zero.

Outputs:
PHP in_array() FOUND @#%?!! 
@#%?!! == 0 AT POSITION 26 BECAUSE OF LOOSE TYPE

<?php // RAY_temp_in_array.php
error_reporting(E_ALL);
echo 
"<pre>";

// THE ALLOWABLE SELECTIONS
$alpha range('A','Z');
$alpha array_merge($alpharange('0''9'));

// LOOK FOR A BOGUS SELECTION
$str '@#%?!!';
if (
in_array($str$alpha))
{
    echo 
"PHP in_array() FOUND $str ";
}
else
{
    echo 
"$str IS NOT IN ARRAY";
}

// SEARCH THE ARRAY FOR THE KEY OF THE STRING
$key array_search($str$alpha);
echo 
"<br/>$str == $alpha[$key] AT POSITION $key";

if (
$str == 0) echo " BECAUSE OF LOOSE TYPE";
?>

[#22] Anonymous [2011-06-18 12:16:44]

known issue
when checking a string vs a integer

$testarray = array(0,1,2,3,4);

in_array("bla", $a) returns true
in_array("bla6", $a) returns true
in_array("6bla", $a) returns false 

"bla" as a integer value returns the number zero
"bla6" as a integer value returns the number zero
 "6bla" returns the number six as its the only vaild part of that

if you checking for unknown types eg string vs integer 
then you would need the strict value to be true.

[#23] Joris Meijer [2011-02-15 05:31:28]

A good option if your array contains objects and you wish to recursively search it (eg. with in_arrayr), is to use json_encode and json_decode first:

<?php

$array 
json_decode(json_encode($array_with_objects), true);

?>


In my opinion this is more elegant than a recursive in_array function which converts the objects into arrays while searching for a key and/or value.

[#24] user at NOSPAM at fullservicead dot com [2011-02-02 08:52:10]

After reading all other notes about performance, 
I made a little test. 

fill an array in a loop with random characters, 
shuffle it 
search on it using 4 methods.

I tried to have haystack as array and string; hence the strstr.

I tried it on 9, 99, 999, 9999 elements and the results
remain in the same order: 

9999 elements

Function :  execution time in miliseconds. 

strstr : 1.2994079589844
fast_in_array : 1.0655579566956
isset : 0.99128198623657 //Winner, used from another note here.
in_array : 2.9410798549652 

One last detail, I moved my functions around in the script to make sure there was no memory caching, reiteration op or whatever, it's all the same. in_array is the slowest and the use of isset($array[$NEEDLE]) the fastest.

I hope it saves somebody else the trouble.

[#25] bosdilooda at gmail dot com [2011-01-21 00:07:08]

There should be a big red warning sign here because this function behaves in mysterious ways...

let haystack be an array of integers:

$arr = array(1,2,3,4,5);

let $needle be a string of "2foobar"

then

in_array($needle,$arr)

will return true because string ("2foobar") evaluates to integer (2).

[#26] ctulek at gmail dot com [2010-08-30 11:07:37]

If you have an array like:
$arr = array(0,1,2,3,4,5);

in_array(NULL, $arr) returns true because you have 0 in your array. That is, in_array does not use === for equal check.

[#27] Svinto [2010-05-22 11:53:56]

in_array() will always return true if a value in the haystack is of type bool(true).
This always hold except when the needle is of type bool(false).

Code:
<?php 
$haystack 
= array(true);
$needle "anything except bool(false)";
$result in_array($needle$haystack);
var_dump($result); #Will always be true
?>


Solution:
run in_array() with strict set to true.
<?php
in_array
($needle$haystacktrue);
?>


Tested on PHP 5.2.6

[#28] bogdan AT bogdanconstantinescu DOT com [2010-04-21 08:01:32]

If you found yourself in need of a multidimensional array in_array like function you can use the one below. Works in a fair amount of time

<?php

    
function in_multiarray($elem$array)
    {
        
$top sizeof($array) - 1;
        
$bottom 0;
        while(
$bottom <= $top)
        {
            if(
$array[$bottom] == $elem)
                return 
true;
            else 
                if(
is_array($array[$bottom]))
                    if(
in_multiarray($elem, ($array[$bottom])))
                        return 
true;
                    
            
$bottom++;
        }        
        return 
false;
    }
?>

[#29] jv at vip dot ie [2010-02-13 16:46:12]

If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...

<?php
$needle 
'test for this';

$flipped_haystack array_flip($haystack);

if ( isset(
$flipped_haystack[$needle]) )
{
  print 
"Yes it's there!";
}
?>


I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times).

Remember to only flip it once at the beginning of your code though!

[#30] natan dot volkovich at gmail dot com [2009-11-30 14:10:16]

If you're trying to find out whether or not at least a single value of an array matches a value in your haystack then use "array_intersect" instead of "in_array".

<?php
$needle 
= array(1,2);
$haystack = array(0,1,2);

echo 
"in_array: ".(int)in_array($needle$haystack); // returns 0
echo "array_intersect: ".(int)array_intersect((array)$needle$haystack); // returns 1
?>

[#31] thomas dot sahlin at gmail dot com [2009-10-05 00:53:45]

If you're creating an array yourself and then using in_array to search it, consider setting the keys of the array and using isset instead since it's much faster.

<?php

$slow 
= array('apple''banana''orange');

if (
in_array('banana'$slow))
    print(
'Found it!');

$fast = array('apple' => 'apple''banana' => 'banana''orange' => 'orange');

if (isset(
$fast['banana']))
    print(
'Found it!');

?>

[#32] robin at robinnixon dot com [2009-07-25 00:38:16]

This function is five times faster than in_array(). It uses a binary search and should be able to be used as a direct replacement:

<?php
function fast_in_array($elem$array)
{
   
$top sizeof($array) -1;
   
$bot 0;

   while(
$top >= $bot)
   {
      
$p floor(($top $bot) / 2);
      if (
$array[$p] < $elem$bot $p 1;
      elseif (
$array[$p] > $elem$top $p 1;
      else return 
TRUE;
   }
     
   return 
FALSE;
}
?>

[#33] john at dwarven dot co dot uk [2009-07-01 04:34:47]

I just struggled for a while with this, although it may be obvious to others.

If you have an array with mixed type content such as:

<?php

 $ary 
= array (
   
1,
   
"John",
   
0,
   
"Foo",
   
"Bar"
 
);

?>


be sure to use the strict checking when searching for a string in the array, or it will match on the 0 int in that array and give a true for all values of needle that are strings strings.

<?php

var_dump
in_array2$ary ) );

// outputs FALSE

var_dumpin_array'Not in there'$ary ) );

// outputs TRUE

var_dumpin_array'Not in there'$aryTRUE ) );

// outputs FALSE

?>

[#34] Thingmand [2009-03-09 11:58:48]

A little function to use an array of needles:

<?php
function array_in_array($needles$haystack) {

    foreach (
$needles as $needle) {

        if ( 
in_array($needle$haystack) ) {
            return 
true;
        }
    }

    return 
false;
}
?>

[#35] brouwer dot p at gmail dot com [2009-03-08 02:55:12]

If made a in_array function that checks if the specified key matches. It works recursivly so it doesn't matter how deep your input array is.
<?php
  
function myInArray($array$value$key){
    
//loop through the array
    
foreach ($array as $val) {
      
//if $val is an array cal myInArray again with $val as array input
      
if(is_array($val)){
        if(
myInArray($val,$value,$key))
          return 
true;
      }
      
//else check if the given key has $value as value
      
else{
        if(
$array[$key]==$value)
          return 
true;
      }
    }
    return 
false;
  }
?>

[#36] Kelvin J [2009-02-28 05:04:52]

For a case-insensitive in_array(), you can use array_map() to avoid a foreach statement, e.g.:

<?php
    
function in_arrayi($needle$haystack) {
        return 
in_array(strtolower($needle), array_map('strtolower'$haystack));
    }
?>

[#37] selmand [at] gmail.com [2009-02-13 04:38:47]

Removes same text with in_array in a string.

<?php

$hizmet
="aeg,akai,aeg,arcelik,aeg,arcelik,klima,kombi";

// alots of same stings

$x=explode(",",$hizmet);

$t= array();
$k=0;
for(
$i=0;$i<sizeof($x);$i++){ // this for remove its
    //echo $x[$i]."\n";
    
if(!in_array($x[$i],$t))
    {
        
$t[$k]=$x[$i];
        
$k++;
    }
    
}

for(
$i=0;$i<sizeof($t);$i++){ // rebuilding $hizmet strings.
    
    
echo $t[$i].",";
    
}

?>

[#38] soxred93 at gmail dot com [2009-01-28 13:37:39]

Here's a simple little function I wrote that is a case insensitive version of in_array():

<?php
    
function in_arrayi$needle$haystack ) {
        
$found false;
        foreach( 
$haystack as $value ) {
            if( 
strtolower$value ) == strtolower$needle ) ) {
                
$found true;
            }
        }    
        return 
$found;
    }
?>

[#39] jordigirones at gmail dot com [2009-01-21 07:54:05]

function similar to in_array but implements LIKE '<string>%'

<?php
   
function in_array_like($referencia,$array){
      foreach(
$array as $ref){
        if (
strstr($referencia,$ref)){          
          return 
true;
        }
      }
      return 
false;
    }
?>

[#40] rhill at xenu-directory dot net [2009-01-17 13:05:03]

I found out that in_array will *not* find an associative array within a haystack of associative arrays in strict mode if the keys were not generated in the *same order*:

<?php

$needle 
= array(
    
'fruit'=>'banana''vegetable'=>'carrot'
    
);

$haystack = array(
    array(
'vegetable'=>'carrot''fruit'=>'banana'),
    array(
'fruit'=>'apple''vegetable'=>'celery')
    );

echo 
in_array($needle$haystacktrue) ? 'true' 'false';
// Output is 'false'

echo in_array($needle$haystack) ? 'true' 'false';
// Output is 'true'

?>


I had wrongly assumed the order of the items in an associative array were irrelevant, regardless of whether 'strict' is TRUE or FALSE: The order is irrelevant *only* if not in strict mode.

[#41] james dot ellis at gmail dot com [2008-10-29 21:17:40]

Be aware of oddities when dealing with 0 (zero) values in an array...

This script:
<?php
$array 
= array('testing',0,'name');
var_dump($array);
//this will return true
var_dump(in_array('foo'$array));
//this will return false
var_dump(in_array('foo'$arrayTRUE));
?>


It seems in non strict mode, the 0 value in the array is evaluating to boolean FALSE and in_array returns TRUE. Use strict mode to work around this peculiarity.
This only seems to occur when there is an integer 0 in the array. A string '0' will return FALSE for the first test above (at least in 5.2.6).

[#42] james dot randell at hotmail dot co dot uk [2008-09-16 02:54:54]

Small method i built for my Array module, after looking through the manual I wanted a small compact way of making a wildcard search through an arrays values, and returning only those that it found.

<?php

    

    
function find ($string$array = array ())
    {        
        foreach (
$array as $key => $value) {
            unset (
$array[$key]);
            if (
strpos($value$string) !== false) {
                
$array[$key] = $value;
            }
        }        
        return 
$array;
    }
?>

[#43] crashrox at gmail dot com [2008-07-21 08:34:02]

Recursive in array using SPL

<?php
function in_array_recursive($needle$haystack) {

    
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack));

    foreach(
$it AS $element) {
        if(
$element == $needle) {
            return 
true;
        }
    }

    return 
false;
}
?>

[#44] Martijn Wieringa [2008-05-19 02:20:39]

When using numbers as needle, it gets tricky:

Note this behaviour (3rd statement):

in_array(0, array(42)) = FALSE
in_array(0, array('42')) = FALSE
in_array(0, array('Foo')) = TRUE
in_array('0', array('Foo')) = FALSE

[#45] sick949 at hotmail dot com [2008-03-05 03:43:05]

A first idea for a function that checks if a text is in a specific column of an array.
It does not use in_array function because it doesn't check via columns.
Its a test, could be much better. Do not use it without test.

<?php

function in_array_column($text$column$array)
{
    if (!empty(
$array) && is_array($array))
    {
        for (
$i=0$i count($array); $i++)
        {
            if (
$array[$i][$column]==$text || strcmp($array[$i][$column],$text)==0) return true;
        }
    }
    return 
false;
}

?>

[#46] guitar king [2008-01-29 11:52:01]

In PHP 4, the first argument seems not allowed to be an object. In PHP 5, also objects are allowed as $needle.

[#47] info at b1g dot de [2007-08-02 10:44:07]

Be careful with checking for "zero" in arrays when you are not in strict mode.
in_array(0, array()) == true
in_array(0, array(), true) == false

[#48] Quaquaversal [2007-05-20 20:48:18]

A simple function to type less when wanting to check if any one of many values is in a single array.

<?php
function array_in_array($needle$haystack) {
    
//Make sure $needle is an array for foreach
    
if(!is_array($needle)) $needle = array($needle);
    
//For each value in $needle, return TRUE if in $haystack
    
foreach($needle as $pin)
        if(
in_array($pin$haystack)) return TRUE;
    
//Return FALSE if none of the values from $needle are found in $haystack
    
return FALSE;
}
?>

[#49] musik at krapplack dot de [2006-06-04 05:52:58]

I needed a version of in_array() that supports wildcards in the haystack. Here it is:

<?php
function my_inArray($needle$haystack) {
    
# this function allows wildcards in the array to be searched
    
foreach ($haystack as $value) {
        if (
true === fnmatch($value$needle)) {
            return 
true;
        }
    }
    return 
false;
}

$haystack = array('*krapplack.de');
$needle 'www.krapplack.de';

echo 
my_inArray($needle$haystack); # outputs "true"
?>


Unfortunately, fnmatch() is not available on Windows or other non-POSIX compliant systems.

Cheers,
Thomas

[#50] rick at fawo dot nl [2006-04-08 20:23:01]

Here's another deep_in_array function, but this one has a case-insensitive option :)
<?php
function deep_in_array($value$array$case_insensitive false){
    foreach(
$array as $item){
        if(
is_array($item)) $ret deep_in_array($value$item$case_insensitive);
        else 
$ret = ($case_insensitive) ? strtolower($item)==$value $item==$value;
        if(
$ret)return $ret;
    }
    return 
false;
}
?>

[#51] sandrejev at gmail dot com [2006-02-22 07:11:26]

Sorry, that deep_in_array() was a bit broken.

<?php
function deep_in_array($value$array) { 
    foreach(
$array as $item) { 
        if(!
is_array($item)) {
            if (
$item == $value) return true;
            else continue; 
        }
        
        if(
in_array($value$item)) return true
        else if(
deep_in_array($value$item)) return true
    } 
    return 
false
}
?>

[#52] kitchin [2006-02-05 06:52:47]

Here's a gotcha, and another reason to always use strict with this function.

$x= array('this');
$test= in_array(0, $x);
var_dump($test); // true

$x= array(0);
$test= in_array('that', $x);
var_dump($test); // true

$x= array('0');
$test= in_array('that', $x);
var_dump($test); // false

It's hard to think of a reason to use this function *without* strict.

This is important for validating user input from a set of allowed values, such as from a <select> tag.

[#53] [2006-01-13 21:44:34]

in_arrayr -- Checks if the value is in an array recursively

Description
bool in_array (mixed needle, array haystack)

<?php
function in_arrayr($needle$haystack) {
        foreach (
$haystack as $v) {
                if (
$needle == $v) return true;
                elseif (
is_array($v)) return in_arrayr($needle$v);
        }
        return 
false;
}
// i think it works
?>

[#54] adrian foeder [2005-11-08 01:21:36]

hope this function may be useful to you, it checks an array recursively (if an array has sub-array-levels) and also the keys, if wanted:

<?php
function rec_in_array($needle$haystack$alsokeys=false)
    {
        if(!
is_array($haystack)) return false;
        if(
in_array($needle$haystack) || ($alsokeys && in_array($needlearray_keys($haystack)) )) return true;
        else {
            foreach(
$haystack AS $element) {
                
$ret rec_in_array($needle$element$alsokeys);
            }
        }
        
        return 
$ret;
    }
?>

[#55] Aragorn5551 at gmx dot de [2005-06-11 05:26:28]

If you have a multidimensional array filled only with Boolean values like me, you need to use 'strict', otherwise in_array() will return an unexpected result.

Example:

<?php
$error_arr 
= array('error_one' => FALSE'error_two' => FALSE, array('error_three' => FALSE'error_four' => FALSE));

if (
in_array (TRUE$error_arr)) { 
   echo 
'An error occurred';
}
else {
   echo 
'No error occurred';
}
?>


This will return 'An error occurred' although theres no TRUE value inside the array in any dimension. With 'strict' the function will return the correct result 'No error occurred'.

Hope this helps somebody, cause it took me some time to figure this out.

[#56] tom at orbittechservices dot com [2002-08-09 19:17:58]

I searched the general mailing list and found that in PHP versions before 4.2.0 needle was not allowed to be an array.

Here's how I solved it to check if a value is in_array to avoid duplicates;

<?php
$myArray 
= array(array('p''h'), array('p''r'));

$newValue "q";
$newInsert = array('p','q');

$itBeInThere 0;
foreach (
$myArray as $currentValue) {
  if (
in_array ($newValue$currentValue)) {
    
$itBeInThere 1;
  }
if (
$itBeInThere != 1) {
  
array_unshift ($myArray$newInsert);
}
?>

上一篇: 下一篇: