Skip to content

Instantly share code, notes, and snippets.

@branneman
Last active January 27, 2021 18:42
Show Gist options
  • Select an option

  • Save branneman/951847 to your computer and use it in GitHub Desktop.

Select an option

Save branneman/951847 to your computer and use it in GitHub Desktop.
array_find() - A case insensitive array_search() with partial matches
<?php
/**
* Case in-sensitive array_search() with partial matches
*
* @param string $needle The string to search for.
* @param array $haystack The array to search in.
*
* @author Bran van der Meer <[email protected]>
* @since 29-01-2010
*/
function array_find($needle, array $haystack)
{
foreach ($haystack as $key => $value) {
if (false !== stripos($value, $needle)) {
return $key;
}
}
return false;
}
@heylookltsme
Copy link
Copy Markdown

Thanks! This was helpful to me, but you've got the params in stripos backwards. Line 14 should be:

if (false !== stripos($value, $needle)) {

@cmfcmf
Copy link
Copy Markdown

cmfcmf commented Jul 1, 2013

Thank you too @branneman! But as @heylookitsme said, the two params must be swaped.

@branneman
Copy link
Copy Markdown
Author

Fixed! Thanks :)

@Flaxative
Copy link
Copy Markdown

Super helpful, thanks!

@rikkouri
Copy link
Copy Markdown

Took me a good ten min to work out why nothing was matching!! Thanks, this is a handy snippet.

@nycmitch25
Copy link
Copy Markdown

nycmitch25 commented Dec 31, 2016

Major issue with the code: Fix the return on error .... it needs to return -1 on a failure, or something OTHER THAN a valid key value. This is because key values start with 0 , hence "false" or "null" etc... makes it hard ... ok impossible to validate this.

// check and set the value using -1 as the return
if ($key = array_find($search_term, $the_array_to_be_searched)) !== -1) {
echo "Found! In Array ".$the_array_to_be_searched[$key]." array value";

}

@cameraki
Copy link
Copy Markdown

For people who need this for both multidimensional and normal arrays, i have adapted it.

function array_find($needle, array $haystack, $column = null) {
    
    if(is_array($haystack[0]) === true) { // check for multidimentional array

        foreach (array_column($haystack, $column) as $key => $value) {
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }

    } else {
        foreach ($haystack as $key => $value) { // for normal array
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }
    }
    return false;
}

Here's an example:

$multiArray = array(
     0 => array(
              'name' => 'kevin',
              'hobbies' => 'Football / Cricket'),
      1 => array(
              'name' => 'tom',
              'hobbies' => 'tennis'),
       2 => array(
              'name' => 'alex',
              'hobbies' => 'Golf, Softball')
);
$singleArray = array(
        0 => 'Tennis',
        1 => 'Cricket',
);

echo "key is - ". array_find('cricket', $singleArray); // returns - key is - 1
echo "key is - ". array_find('cricket', $multiArray, 'hobbies'); // returns - key is - 0

Hope this helps someone. You could also check to see if the $column is found more than once and if some return an array of the keys matching.

Copy link
Copy Markdown

ghost commented May 2, 2018

It saved me from a heart attack! Thank you so much!

@JJJ
Copy link
Copy Markdown

JJJ commented Nov 5, 2019

If you're not afraid of a little bit of regex, preg_grep() is native PHP and will likely do this more quickly:

https://www.php.net/manual/en/function.preg-grep.php

// Looking for "first " at beginning of any array values

// Get results
$results = array_values( preg_grep( '/^first (\w+)/i', array(
    'f', 'fun', 'first', 'first match', 'not first'
) ) );

// Output
var_dump( $results );

// Results
array (size=1)
  0 => string 'first match' (length=11)

The PREG_GREP_INVERT flag even allows quickly targeting the inverse.

// Looking for inverse of "first " at beginning of any array values

// Get results
$results = array_values( preg_grep( '/^first (\w+)/i', array(
    'f', 'fun', 'first', 'first match', 'not first'
), PREG_GREP_INVERT ) );

// Output
var_dump( $results );

// Results
array (size=4)
  0 => string 'f' (length=1)
  1 => string 'fun' (length=3)
  2 => string 'first' (length=5)
  3 => string 'not first' (length=9)

Note that I'm using /i above to denote case insensitivity.

@amatek
Copy link
Copy Markdown

amatek commented Mar 30, 2020

Very helpful. Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment