PHP Array набор и цикл

Я работаю над сценарием, который даст вам информацию о некоторых устройствах Cisco.

class COMMAND
{
...
private $intbrief;
private $core;
private $allcommand;
...

public function __construct()
{
require_once 'class.php';
$this->core = new CLASS();$this->allcommand = array(
array(  "id"    => "brief",
"def"   => "show ip interface brief | exclude un",
"vrf"   => false,
"val"   => "",
),
array(  "id"    => "vrf",
"def"   => "show ip interface ".$this->intbrief." | include VPN Routing/Forwarding",
"vrf"   => false,
"val"   => "",
));
}

...

private function validip($ip)
{
// return true or false
}

public function go($_ip, $_user, $_pass )
{
if($this->validip($_ip))
{
$this->ip = $_ip;
$this->user = $_user;
$this->pass = $_pass;

return $this->logic();
} else {
echo "Invalid Options\n";
exit(1);
}
}private function logic()
{
foreach ($this->allcommand as $i => &$row)
{
if(method_exists($this, $row['id']))
{
if(!empty($this->intbrief))
{
echo "\n\n\n\t".$this->intbrief."---TRUE\n\n\n";
}

if(isset($this->vrf) and $row['vrf'] == true)
{
$command = $row['def']." vrf ".$this->vrf;
} else {
$command = $row['def'];
}

// Send commands to telnet class
$output = $this->core->GetOutputOf($this->ip, $this->user, $this->pass, $command);// Send to parse functions
$row['val'] = $this->$row['id']($output);

} else {
echo "Check functions from allcommand array\n";
exit(1);
}
}
return $this->allcommand;
}

private function brief($match)
{
// parsing output ...
$this->intbrief = $output; // e.g. $this->intbrief = "FastEthernet0/1";

}

private function vrf($match)
{
// parsing output ...
$this->vrf = $output;
}
}

$com = new COMMAND();
$f = $com->go($ip, $user, $password);

Петля работает просто отлично, но …

Массив vrf def является show ip interface | include VPN Routing/Forwarding — без $this->intbriefпотому что это ноль …. Но почему? Я проверил это в цикле …

if(!empty($this->intbrief))
{
echo "\n\n\n\t".$this->intbrief."---TRUE\n\n\n";
}

… и это правда. Так где же ошибка?

Я хочу выполнить что-то вроде show ip interface FastEthernet0/1 | include VPN ...

Я получу информацию «FastEthernet0 / 1» из краткого описания функций

Спасибо за помощь

cdpb

0

Решение

Я снова переосмыслил проблемы и немного протестировал, я думаю, что проблема заключается в создании массива. При создании массива переменные в значениях массива анализируются, а затем значения фиксируются в этом экземпляре массива. Поэтому я думаю, что размещение $ this-> allcommand в конструкции или в любых других функциях не имеет значения. Чтобы решить эту проблему и не слишком сильно изменить структуру вашего класса, я бы предложил при объявлении массива allcommand в

$this->allcommand = array(
array(  "id"    => "brief",
"def"   => "show ip interface brief | exclude un",
"vrf"   => false,
"val"   => "",
),
array(  "id"    => "vrf",
"def"   => "show ip interface <inf> | include VPN Routing/Forwarding",
"vrf"   => false,
"val"   => "",
));

Вы можете затем в функции логики, после получения $command = $row['def']; сделать preg_replace или же str_replace преобразовать <inf> если есть какое-либо значение $this->intbrief, Не может быть лучшим решением, но я могу выйти.

0

Другие решения

Хорошая идея!

Я также немного протестировал и построил что-то вроде цикла while в отдельной функции, которая будет выдавать только одну часть массива за раз. Идея заключается в том, что в каждом цикле цикла переменные внутри будут устанавливаться снова.

Похоже:

    ....

private function arraycommand()
{
static $i = 1;
$allcommand = array(
array(  "id"    => "brief",
"def"   => "show ip interface brief | exclude un",
"vrf"   => false,
),
array(  "id"    => "vrf",
"def"   => "show ip interface ".$this->intbrief." | include VPN Routing/Forwarding",
"vrf"   => false,
),
);

while(count($allcommand) >= $i)
{
$t = $i -1;
$i++;
return $allcommand[$t];
}
return false;
}

private function logic()
{
while(true)
{
$allcommand = array($this->arraycommand());

if(!$allcommand[0] == false)
{
foreach ($allcommand as $i => &$row)
{
...
}
} else break;
}
return output
}

....

Это не очень красиво закодировано, но это работает 🙂

Спасибо за вашу помощь!!!

0

По вопросам рекламы [email protected]