2013-08-18 4 views
1

Вот мой PHP скрипт:PHP Undefined смещение: 1

<?php 
$address = htmlentities(strtolower(Config::get('aac.ip'))); 
$port = Config::get('aac.port'); 

@$sock = fsockopen ($address, $port, $errno, $errstr, 1); 
if(!$sock) echo '<small class="muted"><strong>Server status:</strong></small> <span class="label label-important">OFFLINE</span><br />'; else { 
$info = chr(6).chr(0).chr(255).chr(255).'info'; 
fwrite($sock, $info); 
$data=''; 
while (!feof($sock))$data .= fgets($sock, 1024); 
fclose($sock); 

// if needed 
// var_dump($data); 


preg_match('/players online="(\d+)" max="(\d+)"/', $data, $matches); 
$players = ''.$matches[1].'/'.$matches[2]; 
preg_match('/uptime="(\d+)"/', $data, $matches); 
$h = floor($matches[1]/3600); 
$m = floor(($matches[1] - $h*3600)/60); 
$uptime = ''.$h.'h '.$m.'m'; 
preg_match('/monsters total="(\d+)"/', $data, $matches); 
$monsters = ''.$matches[1]; 
preg_match('#<motd>(.*?)</motd>#s', $data, $matches); 
$motd = ''.$matches[1]; 
preg_match('/npcs total="(\d+)"/', $data, $matches); 
$npcs = ''.$matches[1]; 

if(empty($players) or $players == "/") $players = "???/???"; 
if(empty($uptime)) $uptime = "???"; 
if(empty($monsters)) $monsters = "???"; 
if(empty($motd)) $motd = "???"; 

echo " 
<small class='muted'><strong>Server status:</strong></small> <span class='label label-success'>ONLINE</span><br /> 
<small class='muted'><strong>Players:</strong> $players</small><br /> 
<small class='muted'><strong>Uptime:</strong> $uptime</small><br /> 
<small class='muted'><strong>Monsters:</strong> $monsters</small><br /> 
<small class='muted'><strong>MOTD:</strong> $motd</small><br /> 
$npcs 
"; 
} 

?> 

Переменная $npcs возвращает ошибку Undefined offset: 1. Я пытался решить его разными способами, но никто из них не работал. Кроме того, вот var_dump данных:

string '<?xml version="1.0"?> 
<tsqp version="1.0"><serverinfo uptime="33360" ip="127.0.0.1" servername="Forgotten" port="7171" location="Europe" url="http://otland.net/" server="The Forgotten Server" version="0.2.15" client="9.86"/><owner name="" email="@otland.net"/><players online="2" max="1000" peak="2"/><monsters total="636"/><map name="forgotten" author="Komic" width="1000" height="1000"/><motd>Welcome to the Forgotten Server!</motd></tsqp> 
' (length=442) 

Я пытаюсь получить информацию. Кроме того, могу ли я получить имя сервера, местоположение и все такое? Я не очень переживаю. : P

ошибки
+0

'$ npcs = ''. $ Matches [1];' если это строка, возвращающая ошибку, это означает, что вышеперечисленное 'preg_match()', вероятно, не находит совпадений – JLewkovich

+0

В информации 'npcs 'нет информации в' $ data 'so' $ matches' в строке '$ npcs' пуст. –

+0

Вместо тестирования $ players/$ monsters/etc. лучше проверить ваш preg_match. Пример: 'if (preg_match (........)) {/ * сделать что-то * /} else {/ * сделать что-то еще * /}' –

ответ

9

неопределенное смещения в PHP происходит, когда вы пытаетесь получить доступ к элементу массива с использованием индекса, который не существует, например, скажем, у меня есть следующий:

<?php 
$fruit = array('apple', 'orange', 'pear'); 
echo $fruit[0]; // apple 
echo $fruit[1]; // orange 
echo $fruit[3]; // Undefined offset:3 

В приведенном выше примере массив имеет три элемента. Индексы к этим элементам составляют 0,1,2. Нет элемента с индексом 3. Следовательно, ошибка при попытке доступа к $ fruit [3].

В вашем конкретном случае нет $ совпадений [1]. Вы должны устранить вызов preg_match() и посмотреть, возвращает ли ваш шаблон любые совпадения.

Как более общий совет, я предлагаю вам проверить наличие ключа массива, прежде чем пытаться получить к нему доступ.

Смежные вопросы