使用唯一KEY快速单个VALUE查找哪个PHP数据结构?

时间:2011-01-25 15:23:43

标签: php search multidimensional-array hashtable

我有一个动态生成的内部网络URL列表。对于每个URL,我想:

  1. 找到网址的IP。
  2. 将IP与IP列表及其关联的服务器进行比较。
  3. 返回与IP关联的服务器。
  4. 当然IP在IP列表中是独一无二的,因此有一种推荐的方式来初始存储IP值列表,这样我就可以为它提供一个IP(密钥)并获取相关的服务器(值) ?

    我已经研究过多维数组,甚至是蛮力 - 只需为每个服务器的IP列表创建一个数组 - 但这似乎效率低下。

    这是我想要的PHP(psuedo):

    $IPServerList = array(0 => array(ip=>1.2.3.4,server=>"server1"),
           1 => array(ip=>2.1.3.4,server=>"server2"),
           2 => array(ip=>3.1.3.3,server=>"server1"));
    
    getServer("url1.mycoolurl.com");
    
    function getServer($url) {
        $ip = gethostbyname($url);
    "Search $IPServerList for this $ip and return the 'server' value"
        // 
    
    }
    

    我是否应该存储IP /服务器列表的具体方法?任何推荐内置的PHP函数来进行搜索?任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:3)

我没有看到避免关联数组的任何明显原因:

$IPServerList = array(
  '1.2.3.4' => "server1",
  '2.1.3.4' => "server2",
  '3.1.3.3' => "server1",
);

PHP中的数组double有哈希/地图/字典,具体取决于你习惯用它们调用它们。关键是,你可以使用任何唯一的字符串/数字作为你的数组索引,并且由于你似乎有一对一的IP到服务器名称的映射,这似乎是理想的。

我认为您不太可能在PHP中找到更快的方式来访问您的数据,而且为了简单起见,您无法超越它:

 if (array_key_exists($IPServerList, '192.168.1.1')) {
   echo $IPServerList['192.168.1.1'];
 }

arrays上的PHP手册非常有用。

答案 1 :(得分:1)

这是我能想到的最好的方案就是这样的。

$servers= array(
    'xxx.xxx.xxx.001' => array(
        'name' => "server1", 
        'os' => "Windows"
        ),
    'xxx.xxx.xxx.002' => array(
        'name' => "server2", 
        'os' => "Linux"
        ),
    'xxx.xxx.xxx.003' => array(
        'name' => "server3", 
        'os' => "Mac"
        )
);

执行此类操作后,您可以存储有关服务器名称以外的更多信息,以及使用IP地址访问设置而无需循环。

$ip = 'xxx.xxx.xxx.002';
if ($servers[$ip]){
    $serverName = $servers[$ip]['name'];
    $serverOs = $servers[$ip]['os'];
}

答案 2 :(得分:0)

// IP to search
$ip = '127.0.0.1';

foreach ($IPServerList as $entry) {
    if ($entry['ip'] == $ip) {
        echo 'MATCH :) ';
        var_dump($entry);
        break;
    }
}

答案 3 :(得分:0)

如何将数组从ips中键入?

$IPServerList = array(
    '1.2.3.4' => 'server1',
    '2.3.4.5' => 'server2',
    '3.4.5.6' => 'server3'
);

PHP的数组是数组和散列的混合,并支持同时使用这两种类型的键,所以没有理由在IP也可用时生成唯一的数字键:

echo $IPServerList['1.2.3.4']; // produces 'server1'

如果您需要存储的不仅仅是名称,您可以嵌套数组:

$IPServerList['1.2.3.4'] = array('name' => 'server1', 'this' => 'x', 'that' => 'y')

答案 4 :(得分:0)

如果您使用数组来存储数据,就像在您的示例中一样,您可以使用in_array来检查它是否存在。

http://php.net/manual/en/function.in-array.php

您也可以查看array_search()和array_key_exists()