对于foreach循环内部的循环导致重复

时间:2018-02-01 16:26:23

标签: php

我通过一系列交换机循环并返回它们的端口信息。如果我在1 ip上运行脚本它工作正常,但是当在多个IPS上执行此操作时,我从for循环中获取重复数据。我想在csv文件中的每个开关上运行代码。请帮忙..

任何帮助或分离都会很棒......

$csv = array_map('str_getcsv', file('port_test.csv'));

foreach ($csv as $key => $value) {
    $ip = $value[0];  
    code goes here...

    for loop causes it to do the code for each line in csv file
}


------------------------------
HERE IS MY FULL CODE


<tr id="fsu-header">
    <th>Host Name</th>
    <th>Ports</th>
    <th>Link</th>
    <th>Speed</th>
    <th>POE</th>
    <th>Desciption</th>
    <th>In Bytes</th>
    <th>Out Bytes</th>
    <th>In Errors</th>
    <th>Out Errors</th>
    <th>In Ucast</th>
    <th>Out Ucast</th>
    <th>In Bcast</th>
    <th>Out Bcast</th>           
</tr>
<?php
    //switch infor
    //$host = $_GET['ip'];
    $csv = array_map('str_getcsv', file('port_test.csv'));

    foreach ($csv as $key => $value) {
        $ip = $value[0];                 
        //$ip = "10.16.26.26";
        $community = "passcode";
        $updown1   =  "interfaces.ifTable.ifEntry.ifOperStatus";
        $desc     =  "interfaces.ifTable.ifEntry.ifDescr";
        $speed    =  "interfaces.ifTable.ifEntry.ifSpeed";
        $inbyte   =  "interfaces.ifTable.ifEntry.ifInOctets";
        $outbyte  =  "interfaces.ifTable.ifEntry.ifOutOctets";
        $inerror  =  "interfaces.ifTable.ifEntry.ifInErrors";
        $outerror =  "interfaces.ifTable.ifEntry.ifOutErrors";
        $inucast = "InUcastPkts";
        $outucast = "OutUcastPkts";   
        $found_vname=  ".1.3.6.1.4.1.1991.1.1.3.2.7.1.21"; #vlan names   
        $found_vport=  ".1.3.6.1.4.1.1991.1.1.3.2.6.1.1"; #vlan to port 

        $found_excurrent= ".1.3.6.1.4.1.1991.1.1.1.1.18"; #exhaust current

        $found_exwarn=  ".1.3.6.1.4.1.1991.1.1.1.1.19"; #exhaust warn
        $found_exshut=  ".1.3.6.1.4.1.1991.1.1.1.1.20"; #exhaust shut

        $found_power=  ".1.3.6.1.4.1.1991.1.1.1.2.1.1.3"; #power supply

        $cserial =  ".1.3.6.1.4.1.9.3.6.3";    #serial number cisco
#       $fserial =  "  .1.3.6.1.4.1.1991.1.1.2.8.1.1.6";     #foundry serial
        $fserial =  ".1.3.6.1.4.1.1991.1.1.1.1.2";     #foundry serial
        $fsnmp_poe =  ".1.3.6.1.4.1.1991.1.1.2.14.2.2.1.3";  #foundry poe status
        $fesnmp_poe =  ".1.3.6.1.4.1.1991.1.1.3.3.1.1.58";         #found fes poe                       
        ///////////////////////////////////////////////////////////////
        //launch snmp walk

        //port numbers
         $sysName = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" sysName.0');
         $sys_name = substr($sysName, strpos($sysName, "STRING:") + 8); 

        $port_num = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" ifDescr');
        $port_number = explode("IF-MIB", trim($port_num));
        //Port Description
        $output = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" ifAlias');
        $port_des1 = explode("IF-MIB", trim($output));

        $speeds = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$speed.'"');
        $speeds_ = explode("IF-MIB", trim($speeds));

        $poe = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$fsnmp_poe.'"');
        $poe_wat = explode("SNMPv2", trim($poe));


        $updown = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" interfaces.ifTable.ifEntry.ifOperStatus');
        $updown_stat = explode("IF-MIB", trim($updown));

        $in_bytes = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$inbyte.'"');
        $in_byte = explode("IF-MIB", trim($in_bytes));


        $out_bytes = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$outbyte.'"');
        $out_byte = explode("IF-MIB", trim($out_bytes));

        $in_errors = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$inerror.'"');
        $in_error = explode("IF-MIB", trim($in_errors));

        $out_errors = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$outerror.'"');
        $out_error = explode("IF-MIB", trim($out_errors));

        $in_ucasts = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$inucast.'"');
        $in_cast = explode("IF-MIB", trim($in_ucasts));

        $out_ucasts = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" "'.$outucast.'"');
        $out_cast = explode("IF-MIB", trim($out_ucasts));

        $in_nucasts = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" ifInNUcast');
        $in_ncast = explode("IF-MIB", trim($in_nucasts));

        $out_nucasts = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" ifOutNUcast');
        $out_ncast = explode("IF-MIB", trim($out_nucasts));


        // output data to tables
        for ($i=1; $i < count($port_number) ; $i++) {
            $port_des_ = substr($port_number[$i], strpos($port_number[$i], "STRING:") + 8);
            $port_des_1 = substr($port_des1[$i], strpos($port_des1[$i], "STRING:") + 8);    
            $speeds_1 = substr($speeds_[$i], strpos($speeds_[$i], "Gauge32:") + 8);
            if(strpos( $speeds_1 , '1000000000' ) !== false){$speeds_1 = "1Gb";}
            if(strpos( $speeds_1 , '10000000' ) !== false){$speeds_1 = "10Mb";}
            if(strpos( $speeds_1 , '100000000' ) !== false){$speeds_1 = "100Mb";}  
            if (preg_match('/40Gig/',$port_des_) & strpos( $speeds_1 , '4294967295' ))$speeds_1 = "40Gb";
            if(strpos( $speeds_1 , '4294967295' ) !== false){$speeds_1 = "10Gb";}                                         
            $updown_stat_1 = substr($updown_stat[$i], strpos($updown_stat[$i], "") + 8);    
                if(strpos( $updown_stat_1 , 'up(1)' ) !== false){$updown_stat_1 = "UP";}
                else{$updown_stat_1 = "DOWN";}
            $inbytes = substr($in_byte[$i], strpos($in_byte[$i], "Counter32") + 10);
            $outbytes = substr($out_byte[$i], strpos($out_byte[$i], "Counter32") + 10);
            $inerrors = substr($in_error[$i], strpos($in_error[$i], "Counter32") + 10);
            $outerrors = substr($out_error[$i], strpos($out_error[$i], "Counter32") + 10);
            $inucasts = substr($in_cast[$i], strpos($in_cast[$i], "Counter32") + 10);
            $outucasts = substr($out_cast[$i], strpos($out_cast[$i], "Counter32") + 10);
            $inbcasts = substr($in_ncast[$i], strpos($in_ncast[$i], "Counter32") + 10);
            $outbcasts = substr($out_ncast[$i], strpos($out_ncast[$i], "Counter32") + 10);
            $poe_watts = substr($poe_wat[$i], strpos($poe_wat[$i], "SNMPv2") +53);
            $sys_name_ = substr($sysName, strpos($sysName, "STRING:") + 8);
            // table rows / data
            $table .= '<tr>';
            $table .= '<td>'.$sys_name_.'</td>';                                         
            $table .= '<td>'.$port_des_.'</td>';
            $table .= '<td>'.$updown_stat_1.'</td>';
            $table .= '<td>'.$speeds_1.'</td>';
            $table .= '<td>'.$poe_watts.'</td>';
            $table .= '<td>'.$port_des_1.'</td>';
            $table .= '<td>'.$inbytes.'</td>';
            $table .= '<td>'.$outbytes.'</td>';
            $table .= '<td>'.$inerrors.'</td>';
            $table .= '<td>'.$outerrors.'</td>';
            $table .= '<td>'.$inucasts.'</td>';
            $table .= '<td>'.$outucasts.'</td>';
            $table .= '<td>'.$inbcasts.'</td>';
            $table .= '<td>'.$outbcasts.'</td>';
            $table .= '</tr>';
        }
         echo $table;
        }

enter code here
?>
</table>

1 个答案:

答案 0 :(得分:0)

First, some cleanup. There is no reason to have this block of assignments within the foreach loop. You are setting them each time the loop happens, they should be outside of the loop:

        $community = "passcode";
        $updown1   =  "interfaces.ifTable.ifEntry.ifOperStatus";
        $desc     =  "interfaces.ifTable.ifEntry.ifDescr";
        ...
        $fesnmp_poe =  ".1.3.6.1.4.1.1991.1.1.3.3.1.1.58";         #found fes poe   

Now, to understand the code flow, let's make a pseudo-code representation:

//Get CSV data
$csv = array_map('str_getcsv', file('port_test.csv'));

// Variable Assignments

// Loop each line from CSV
foreach ($csv as $key => $value) {
 $ip = $value[0];

 // Collect data using snmpwalk
 $port_num = shell_exec('/usr/bin/snmpwalk -c "'.$community.'" -v 1 "'.$ip.'" ifDescr');
 $port_number = explode("IF-MIB", trim($port_num));

 // Loop for each port number, skipping first value from exploded array
 for ($i=1; $i < count($port_number) ; $i++) {

  // Display row of gathered information.
  $table .= $info;

 }

}

This will for each IP address display a row of information for each port number found.

Inside the foreach loop, all arrays are replaced each time, so data from the previous iteration will not be used again.

But the issue is that $table is not being cleared. You need to add a line in at the top of the loop to reset $table:

for ($i=1; $i < count($port_number) ; $i++) {
 $table = '';

There also is a potential issue I see. Most of the shell_exec calls return arrays. I can't see the data that each is outputting, but I'm guessing that the data doesn't magically line up with the same amount of data as the port number array.

Imagine this scenario:

$port_number = explode("IF-MIB", trim($port_num));
print_r($port_number);
// outputs: array(12,34,45,67,78,89)

$poe_wat = explode("SNMPv2", trim($poe));
print_r($poe_wat);
// outputs: array(20,10,30)

$in_byte = explode("IF-MIB", trim($in_bytes));
print_r($in_byte);
// outputs: array(1,2,3,4,5,6,7,8,9,10)

I don't see how the data would line up from each of these calls if they returned different result values that didn't directly correlate to the port number.