【问题标题】:php - finding keys in an array that match a patternphp - 在数组中查找与模式匹配的键
【发布时间】:2012-09-18 17:54:26
【问题描述】:

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

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

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

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

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

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

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

谢谢。

【问题讨论】:

  • 如果前缀依赖于用户输入,它可以是任何东西,对吧?
  • 用户可以输入 a.a、a.* 还是限制为 2.*、3.*、*.5(数字)?如果它们仅限于数字,它们是否仅限于第十位?最后,键 ([2.5]) 是像它们看起来那样的双打还是字符串?

标签: php


【解决方案1】:

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

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

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

看看preg_grep函数。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 有什么办法可以避免循环吗?
    • 这不是正确的答案,正确的可以在下面找到,JvdBerg 有正确的。 PHP中有一个专门用于在数组中查找匹配键的函数
    【解决方案3】:

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

    $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
    【解决方案4】:

    这就是我的方式

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

        • 这将覆盖$your_array中的重复值。
        【解决方案7】:

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

        <?php
        $array = [2.5 => 'ABDE', 4.8 => 'Some other value'];
        
        preg::grep_keys("/$prefix\.\d/i", $array);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-27
          • 1970-01-01
          • 2012-07-10
          相关资源
          最近更新 更多