【问题标题】:searching within all keys in a multidimensional array PHP在多维数组 PHP 中的所有键中搜索
【发布时间】:2011-08-15 16:37:54
【问题描述】:

我想在多维数组中搜索特定字符串的所有键。我只需要弄清楚它是否存在,仅此而已。我想知道访问者的 IP 是否存在于任何数组中。

有没有我可以使用的 php 函数或方法来执行此操作,我尝试过的每个函数或方法总是返回 false。 (in_array, array_search, array_filter)

我希望避免循环遍历每个键和一组值。

示例数组

Array
(
    [21] => Array
        (
            [click_id] => 21
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:56:57
            [url_id] => 11
        )

    [22] => Array
        (
            [click_id] => 22
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 17:57:05
            [url_id] => 12
        )

    [23] => Array
        (
            [click_id] => 23
            [ip_addr] => 109.148.183.1
            [dtime] => 2011-04-28 18:42:42
            [url_id] => 10
        )
)

谢谢

【问题讨论】:

    标签: php arrays search multidimensional-array


    【解决方案1】:

    我可以想象一种你不必循环的方式(至少你自己):

    $term = preg_quote('109.148.183.1', '~'); // lets make sure it's safe
    $result = array_map('unserialize', preg_filter('~' . $term . '~', '$0', array_map('serialize', $data)));
    
    echo '<pre>';
    print_r($result);
    echo '</pre>';
    

    使用您的示例数据:

    $data = array
    (
        21 => array
        (
            'click_id' => 21,
            'ip_addr' => '109.148.183.1',
            'dtime' => '2011-04-28 17:56:57',
            'url_id' => 11,
        ),
    
        22 => array
        (
            'click_id' => 22,
            'ip_addr' => '109.148.183.1',
            'dtime' => '2011-04-28 17:57:05',
            'url_id' => 12,
        ),
    
        23 => array
        (
            'click_id' => 23,
            'ip_addr' => '109.148.183.1',
            'dtime' => '2011-04-28 18:42:42',
            'url_id' => 10,
        ),
    );
    

    它正确返回值为109.148.183.1 的键(212223):

    Array
    (
        [21] => Array
            (
                [click_id] => 21
                [ip_addr] => 109.148.183.1
                [dtime] => 2011-04-28 17:56:57
                [url_id] => 11
            )
    
        [22] => Array
            (
                [click_id] => 22
                [ip_addr] => 109.148.183.1
                [dtime] => 2011-04-28 17:57:05
                [url_id] => 12
            )
    
        [23] => Array
            (
                [click_id] => 23
                [ip_addr] => 109.148.183.1
                [dtime] => 2011-04-28 18:42:42
                [url_id] => 10
            )
    )
    

    由于这是一个正则表达式,我们能够进行更强大的搜索,例如搜索所有具有奇数秒数2011-04-28日期:

    $term = '2011-04-28 [0-9]{2}:[0-9]{2}:[0-9][13579]';
    $result = array_map('unserialize', preg_filter('~' . $term . '~', '$0', array_map('serialize', $data)));
    
    echo '<pre>';
    print_r($result);
    echo '</pre>';
    

    还有输出:

    Array
    (
        [21] => Array
            (
                [click_id] => 21
                [ip_addr] => 109.148.183.1
                [dtime] => 2011-04-28 17:56:57
                [url_id] => 11
            )
    
        [22] => Array
            (
                [click_id] => 22
                [ip_addr] => 109.148.183.1
                [dtime] => 2011-04-28 17:57:05
                [url_id] => 12
            )
    )
    

    【讨论】:

      【解决方案2】:
      $matching_keys = array();
      
      function search ($item, $key) {
        global $matching_keys();
        // do your testing here, stuff matches in $matching_keys, or however you wanna do it
      }
      array_walk_recursive($array, 'search');
      

      或者,您可以编写自己的递归函数并避免使用全局函数。这只是最直接的方式。

      【讨论】:

        【解决方案3】:

        永远无法避免循环:-)

        function search($array, $searchString){
           foreach($array as $key=>$val){
                if(in_array($searchString, $val)) return true;
           }
           return false;
        }
        
        //use it like so:
        if(search($array, '109.148.183.1')){/*do something*/}
        

        【讨论】:

          猜你喜欢
          • 2020-01-15
          • 2019-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-16
          • 2016-12-12
          • 2016-09-19
          • 2017-03-23
          相关资源
          最近更新 更多