Набор PHP-массив и цикл

0

Я работаю над скриптом, который предоставит вам информацию о некоторых устройствах 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);

Loop работает отлично, но...

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

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

... и его истинной. Итак, где ошибка?

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

Я получу информацию "FastEthernet0/1" из резюме частной функции

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

cdpb

  • 0
    как вы начинаете командный класс
  • 0
    @onegun $com = new COMMAND(); $f = $com->go($ip, $user, $password); Я исправлю основной код выше ...
Теги:
multidimensional-array
set
foreach
null

2 ответа

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. Maynot будет лучшим решением, но я могу выйти.

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
    это здорово, рад, что вы разбираетесь, наслаждайтесь кодированием :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню