2011-01-25 26 views
0

我有從我們的內部網絡動態生成的URL列表。對於每個網址,我想要:哪個PHP數據結構可以使用獨特的KEY快速進行單個VALUE查找?

  1. 找到URL的IP。
  2. 將IP與IP列表及其關聯的服務器進行比較。
  3. 返回與IP關聯的服務器。

IP當然是IP列表中的UNIQUE,那麼有沒有推薦的方法來初始存儲IP值列表,以便我可以提供一個IP(密鑰)並獲取關聯的服務器(值)?

我已經看過多維數組,甚至是蠻力 - 只是爲每個單獨的服務器的IP列表創建一個數組 - 但這似乎效率低下。

這裏是我想有PHP(僞):

$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函數進行搜索?任何幫助表示讚賞!

回答

3

我沒有看到任何明顯的原因,以避免關聯數組:

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

陣列在PHP雙有hashs /地圖/字典,這取決於你已經習慣了叫他們什麼。問題是,你可以爲數組索引使用任何唯一的字符串/數字,並且由於你似乎有IP到服務器名稱的1對1映射,這看起來很理想。

我不認爲你可能會發現在PHP中一個更快的方法來訪問你的數據,你不能爲了簡單起見,打敗它:

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

arrays PHP手冊會有用。

+0

毆打它......並減少OPs數組結構的內存使用量。 –

+0

+1不需要更復雜:) – kapa

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

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

然後,他可能需要將'ip'字段設置爲多維數組,以便他可以將相應的服務器與其關聯。 – RageD

+0

'O(n)'...要走的路。 – delnan

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') 
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']; 
} 
相關問題