22

我有一个看起来像这样的数组:

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

如何找到键与模式匹配的任何键/值对?我会知道密钥中第一个数字的值,但不知道第二个数字。例如,使用前缀“2.”,我希望能够以某种方式找到键“2.5”并返回键和值“ABDE”。

我正在考虑使用具有如下模式的正则表达式:

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

然后遍历数组并检查每个键。(顺便说一下,仅出于演示目的,$prefix 已被硬编码为 2,但在实际系统中,这是用户输入提供的值)。

我想知道是否有更简单的方法可以做到这一点?

谢谢。

4

7 回答 7

58

我认为你需要这样的东西:

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

结果将是一个数组,其中包含与正则表达式匹配的所有键。这些键可用于检索相应的值。

看看preg_grep函数。

于 2012-09-18T18:04:55.083 回答
18

您可以简单地遍历数组并检查键

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

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

您可以将其包装在一个函数中并将您的模式作为参数传递

于 2012-09-18T17:59:16.513 回答
13

老问题,但这是我喜欢做的事情:

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

preg_grep+array_keys将找到所有键

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

您可以添加array_intersect_keyarray_flip提取与模式匹配的数组切片

$vals = array_intersect_key( $array, array_flip( preg_grep( '/^2\.\d/i', array_keys( $array ) ) ) );
于 2015-07-16T15:02:42.960 回答
1

那是我的方式

$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");
}
于 2017-11-16T15:52:05.420 回答
1

对于遇到相同问题的未来程序员。这是一个更完整的解决方案,它不使用任何循环。

    $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);
于 2019-06-03T13:14:34.003 回答
0

要获得具有匹配键的数组的一部分,您还可以编写

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

如果您的数组太大,这可能只会导致性能问题。

于 2018-09-03T14:58:12.163 回答
0

PHP中有用于正则表达式的T-Regx库,它是kaspreg::grep_keys()方法。

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

preg::grep_keys("/$prefix\.\d/i", $array);
于 2021-01-18T19:22:34.120 回答