php-在数组中查找与模式匹配的键
我有一个数组,看起来像:php-在数组中查找与模式匹配的键,php,Php,我有一个数组,看起来像: Array ( [2.5] => ABDE [4.8] => Some other value ) 如何找到键与模式匹配的任何键/值对?我将知道密钥中第一个数字的值,但不知道第二个数字的值。例如,使用前缀“2”,我希望能够找到键“2.5”,并返回键和值“ABDE” 我在考虑使用一个正则表达式,其模式如下: $prefix = 2; $pattern = '/'.$prefix.'\.\d/i'; 然后在数组中循环并检查每个键。(顺便说一句,仅出于演示
Array ( [2.5] => ABDE [4.8] => Some other value )
如何找到键与模式匹配的任何键/值对?我将知道密钥中第一个数字的值,但不知道第二个数字的值。例如,使用前缀“2”,我希望能够找到键“2.5”,并返回键和值“ABDE”
我在考虑使用一个正则表达式,其模式如下:
$prefix = 2;
$pattern = '/'.$prefix.'\.\d/i';
然后在数组中循环并检查每个键。(顺便说一句,仅出于演示目的,$prefix已硬编码为2,但在实际系统中,这是用户输入提供的值)
我想知道有没有更简单的方法
谢谢 您只需在数组中循环并检查键即可
$array = array(...your values...);
foreach($array as $key => $value) {
if (preg_match($pattern,$key)){
// it matches
}
}
您可以将其封装在函数中,并将模式作为参数传递我认为您需要这样的东西:
$keys = array_keys($array);
$result = preg_grep($pattern, $keys);
结果将是一个数组,其中包含与正则表达式匹配的所有键。这些键可用于检索相应的值
看看函数。老问题,但我喜欢做以下几点:
$array = [ '2.5' => 'ABDE', '4.8' => 'Some other value' ];
preg\u grep
+array\u keys
将找到所有键
$keys = preg_grep( '/^2\.\d/i', array_keys( $array ) );
您可以添加array\u intersect\u key
和array\u flip
以提取与阵列匹配的阵列切片
$vals = array_intersect_key( $array, array_flip( preg_grep( '/^2\.\d/i', array_keys( $array ) ) ) );
这就是我的方式
$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");
}
要仅获取具有匹配键的数组部分,还可以编写
$matching_array = array_flip(preg_grep($pattern, array_flip($your_array)));
如果阵列太大,这可能会导致性能方面的问题。对于遇到相同问题的未来程序员。这里有一个更完整的解决方案,它不使用任何循环
$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);
PHP中有一个正则表达式库,它是一个preg::grep_keys()
方法
如果前缀依赖于用户输入,那么它可以是任何内容,对吗?用户可以输入a.a、a.*还是将用户限制为2.*、3.*、5(数字)?如果他们只限于人数,他们是否只限于十分之一?最后,键([2.5])是看起来像双倍的还是字符串?有没有办法避免循环?这不是正确的答案,正确的答案可以在下面找到,JvdBerg有正确的答案。PHP中有一个函数专门用于在数组中查找匹配的键。数组_键是我所需要的+1这将覆盖$your\u数组中的重复值。