我有一个动态生成的内部网络URL列表。对于每个URL,我想:
当然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函数来进行搜索?任何帮助表示赞赏!
答案 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()