25

I have an array that looks like:

 Array ( [2.5] => ABDE [4.8] => Some other value ) 

How would I find any key/value pair where the key matches a pattern? I will know the value of the first digit in the key,but not the second. so for example, using a prefix of "2.", I want to somehow be able to find the key "2.5" and return both the key and the value "ABDE".

I was thinking about using a regular expression with a pattern like:

$prefix = 2;
$pattern = '/'.$prefix.'\.\d/i';

and then looping through the array and checking each key. (by the way, just for demo purposes, $prefix has been hardcoded to 2, but in the real system, this is a value provided by the user's input).

I'm wondering if there's a simpler way to do this?

Thanks.

2
  • if the prefix is dependent on user input, it can be anything, right? Commented Sep 18, 2012 at 17:59
  • Can the user enter a.a, a.* or is the user limited to 2.*, 3.*, *.5 (numbers)? And if they are limited to numbers are they limited to the tenths place? And finally are the keys ([2.5]) doubles like they appear to be or are they strings? Commented Sep 18, 2012 at 18:22

7 Answers 7

66

I think you need something like this:

$keys = array_keys($array);
$result = preg_grep($pattern, $keys);

The result will be a array that holds all the keys that match the regex. The keys can be used to retrieve the corresponding value.

Have a look at the preg_grep function.

Sign up to request clarification or add additional context in comments.

Comments

20

you can simply loop through the array and check the keys

$array = array(...your values...);

foreach($array as $key => $value) {
    if (preg_match($pattern,$key)){
        // it matches
    }
}

You can wrap it in a function and pass your pattern as parameter

2 Comments

is there any way to avoid looping?
this is not the right anwer, the right one can be found lower down, JvdBerg has the right one. There's a function in PHP specifically for finding matching keys in an array
14

Old question, but here's what I like to do:

$array = [ '2.5' => 'ABDE', '4.8' => 'Some other value' ];

preg_grep + array_keys will find all keys

$keys = preg_grep( '/^2\.\d/i', array_keys( $array ) );

You can add array_intersect_key and array_flip to extract a slice of the array that matches the pattern

$vals = array_intersect_key( $array, array_flip( preg_grep( '/^2\.\d/i', array_keys( $array ) ) ) );

1 Comment

The array_keys was what I needed. +1
3

For future programmers who encounter the same issue. Here is a more complete solution which doesn't use any loops.

    $array = ['2.5'=> 'ABCDE', '2.9'=>'QWERTY'];
    $keys = array_keys($array);
    $matchingKeys = preg_grep('/^2\.+/', $keys);
    $filteredArray = array_intersect_key($array, array_flip($matchingKeys));
    print_r($filteredArray);

Comments

1

That are my ways

$data = ["path"=>"folder","filename"=>"folder/file.txt","required"=>false];

// FIRST WAY

$keys = array_keys($data);
if (!in_array("path", $keys) && !in_array("filename",$keys) && !in_array("required",$keys)) {
    return myReturn(false, "Dados pendentes");
}

// SECOND WAY

$keys = implode("," array_keys($data));
if (!preg_match('/(path)|(filename)|(required)/'), $keys) {
    return myReturn(false, "Dados pendentes");
}

Comments

1

There's T-Regx library for regular expression in PHP, and it kas preg::grep_keys() method.

<?php
$array = [2.5 => 'ABDE', 4.8 => 'Some other value'];

preg::grep_keys("/$prefix\.\d/i", $array);

Comments

0

To get just the part of the array with matching keys you could also write

$matching_array = array_flip(preg_grep($pattern, array_flip($your_array)));

This might just lead to problems performance-wise, if your array gets too big.

1 Comment

This will override duplicate values in $your_array.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.