在 PHP 中查找匹配模式的数组键

25

我有一个数组看起来像:

 Array ( [2.5] => ABDE [4.8] => Some other value ) 
我如何查找键与模式匹配的任何键/值对?我将知道键中第一个数字的值,但不知道第二个数字。例如,使用前缀“2。”,我想以某种方式查找键“2.5”,并返回键和值“ABDE”。
我考虑使用正则表达式,并使用类似以下的模式:
$prefix = 2;
$pattern = '/'.$prefix.'\.\d/i';

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

我想知道是否有更简单的方法来完成这个任务?

谢谢。


如果前缀取决于用户输入,那么它可以是任何东西,对吗? - Teena Thomas
用户能输入a.a、a.*吗?还是只限于2.*、3..5(数字)?如果他们只能输入数字,是否限制为十分位?最后,键([2.5])像它们出现的那样是双精度浮点数吗,还是字符串? - Gabe Spradlin
7个回答

62

我认为你需要这样做:

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

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

请查看preg_grep函数。


20

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

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

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

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


1
有没有办法避免循环? - dot
3
这不是正确的答案,正确的可以在下方找到,JvdBerg 给出了正确的答案。PHP 中有一个专门用于在数组中查找匹配键的函数。 - patrick

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 ) ) ) );

array_keys 是我所需要的。+1 - DarkNeuron

3

对于未来遇到相同问题的程序员们,这里提供一种更完整的解决方案,不需要使用任何循环。

最初的回答:

    $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);

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");
}

1
在 PHP 中有一个用于正则表达式的T-Regx库,它具有preg::grep_keys()方法。
<?php
$array = [2.5 => 'ABDE', 4.8 => 'Some other value'];

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

0

如果你只想获取数组中与指定键匹配的部分,你也可以这样写

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

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

这将覆盖$your_array中的重复值。 - Danon

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