首页 > 解决方案 > PHP 警告:array_combine() 和 array_merge() 生成警告

问题描述

下面的代码正在生成以下几个错误,它指向

PHP Warning: array_merge(): Expected parameter 1 to be an array, null given in /home/mike/snmpCode.php on line 20

PHP Warning: array_combine(): Both parameters should have an equal number of elements in /home/mike/snmpCode.php on line 20

#!/usr/bin/php
<?PHP

$data = snmp3_real_walk (
    'localhost',
    'User3',
    'authPriv',
    'MD5',
    'pwd123',
    'DES',
    'pwd123',
    'ETRA-VRTR-MIB::vRtrIfName'
);

print_r($data);

$Array = array();

foreach($data as $key => $val) {
    $newval = explode(':',trim($val, 'STRING: '));
    $newkey = explode(' ',trim($key, '[ETRA-VRTR-MIB::vRtrIfName.]'));
    $Array = array_merge($Array, array_combine($newkey, $newval));
}

$data = $Array;

print_r($data);

?>

似乎指向$Array = array_merge($Array, array_combine($newkey, $newval));

我似乎无法弄清楚这个问题。

下面是snmp3_real_walk()分配函数返回值后 $data 的打印输出的数组snmp3_real_walk()

Array
(
    [ETRA-VRTR-MIB::vRtrIfName.1.1] => STRING: "intf1"
    [ETRA-VRTR-MIB::vRtrIfName.1.2] => STRING: "intf2"
    [ETRA-VRTR-MIB::vRtrIfName.1.3] => STRING: "intf3"
    [ETRA-VRTR-MIB::vRtrIfName.1.4] => STRING: "intf4"
    [ETRA-VRTR-MIB::vRtrIfName.1.6] => STRING: "intf5"
    [ETRA-VRTR-MIB::vRtrIfName.1.7] => STRING: "intf6"
    [ETRA-VRTR-MIB::vRtrIfName.1.8] => STRING: "intf7"
    [ETRA-VRTR-MIB::vRtrIfName.1.9] => STRING: "intf8"
    [ETRA-VRTR-MIB::vRtrIfName.1.10] => STRING: "intf9"
    [ETRA-VRTR-MIB::vRtrIfName.1.11] => STRING: "intf10"
    [ETRA-VRTR-MIB::vRtrIfName.1.12] => STRING: "intf11"
    [ETRA-VRTR-MIB::vRtrIfName.1.13] => STRING: "intf12"
    [ETRA-VRTR-MIB::vRtrIfName.1.14] => STRING: "intf13"
    [ETRA-VRTR-MIB::vRtrIfName.1.15] => STRING: "intf14"
    [ETRA-VRTR-MIB::vRtrIfName.1.19] => STRING: "intf15"
    [ETRA-VRTR-MIB::vRtrIfName.1.39] => STRING: "intf16"
    [ETRA-VRTR-MIB::vRtrIfName.1.64] => STRING: "intf17"
)

我没有将 $data 分配给 snmp_walk 函数返回并创建如下所示的数组,而是没有任何问题。

$data = array(
    '[ETRA-VRTR-MIB::vRtrIfName.1.1]' => 'STRING: "intf1"', 
    '[ETRA-VRTR-MIB::vRtrIfName.1.2]' => 'STRING: "intf2"'
);

你能帮忙吗?

标签: phpsnmparray-mergearray-combine

解决方案


不幸的是,你的英文描述不是很好,我不能 100% 确定你想做什么。

到目前为止,我的理解是该函数snmp3_real_walk返回给您一个包含以下数据的数组:

Array
(
    [ETRA-VRTR-MIB::vRtrIfName.1.1] => STRING: "intf1"
    [ETRA-VRTR-MIB::vRtrIfName.1.2] => STRING: "intf2"
    [ETRA-VRTR-MIB::vRtrIfName.1.3] => STRING: "intf3"
    [ETRA-VRTR-MIB::vRtrIfName.1.4] => STRING: "intf4"
    [ETRA-VRTR-MIB::vRtrIfName.1.6] => STRING: "intf5"
    [ETRA-VRTR-MIB::vRtrIfName.1.7] => STRING: "intf6"
    [ETRA-VRTR-MIB::vRtrIfName.1.8] => STRING: "intf7"
    [ETRA-VRTR-MIB::vRtrIfName.1.9] => STRING: "intf8"
    [ETRA-VRTR-MIB::vRtrIfName.1.10] => STRING: "intf9"
    [ETRA-VRTR-MIB::vRtrIfName.1.11] => STRING: "intf10"
    [ETRA-VRTR-MIB::vRtrIfName.1.12] => STRING: "intf11"
    [ETRA-VRTR-MIB::vRtrIfName.1.13] => STRING: "intf12"
    [ETRA-VRTR-MIB::vRtrIfName.1.14] => STRING: "intf13"
    [ETRA-VRTR-MIB::vRtrIfName.1.15] => STRING: "intf14"
    [ETRA-VRTR-MIB::vRtrIfName.1.19] => STRING: "intf15"
    [ETRA-VRTR-MIB::vRtrIfName.1.39] => STRING: "intf16"
    [ETRA-VRTR-MIB::vRtrIfName.1.64] => STRING: "intf17"
)

但是当您运行foreach外观时,您会收到太多类型的警告:

PHP Warning: array_merge(): Expected parameter 1 to be an array, null given in /home/mike/snmpCode.php on line 20

PHP Warning: array_combine(): Both parameters should have an equal number of elements in /home/mike/snmpCode.php on line 20

根据您共享的数据,我编写了以下代码,运行平稳,没有警告:

// I have comment out this code on my local, because I don't have 
// the implementation you use on your own development environment:
//
// $data = snmp3_real_walk (
//     'localhost',
//     'User3',
//     'authPriv',
//     'MD5',
//     'pwd123',
//     'DES',
//     'pwd123',
//     'ETRA-VRTR-MIB::vRtrIfName'
// );

// By this code, I have simulated the output of the data you have provide 
// in your example:
$data = [
    "ETRA-VRTR-MIB::vRtrIfName.1.1" => "STRING: intf1",
    "ETRA-VRTR-MIB::vRtrIfName.1.2" => "STRING: intf2",
    "ETRA-VRTR-MIB::vRtrIfName.1.3" => "STRING: intf3",
    "ETRA-VRTR-MIB::vRtrIfName.1.4" => "STRING: intf4",
    "ETRA-VRTR-MIB::vRtrIfName.1.6" => "STRING: intf5",
    "ETRA-VRTR-MIB::vRtrIfName.1.7" => "STRING: intf6",
    "ETRA-VRTR-MIB::vRtrIfName.1.8" => "STRING: intf7",
    "ETRA-VRTR-MIB::vRtrIfName.1.9" => "STRING: intf8",
    "ETRA-VRTR-MIB::vRtrIfName.1.10" => "STRING: intf9",
    "ETRA-VRTR-MIB::vRtrIfName.1.11" => "STRING: intf10",
    "ETRA-VRTR-MIB::vRtrIfName.1.12" => "STRING: intf11",
    "ETRA-VRTR-MIB::vRtrIfName.1.13" => "STRING: intf12",
    "ETRA-VRTR-MIB::vRtrIfName.1.14" => "STRING: intf13",
    "ETRA-VRTR-MIB::vRtrIfName.1.15" => "STRING: intf14",
    "ETRA-VRTR-MIB::vRtrIfName.1.19" => "STRING: intf15",
    "ETRA-VRTR-MIB::vRtrIfName.1.39" => "STRING: intf16",
    "ETRA-VRTR-MIB::vRtrIfName.1.64" => "STRING: intf17"
];
$Array = [];

foreach($data as $key => $val) {
    $newval = explode(':',trim($val, 'STRING: '));
    $newkey = explode(' ',trim($key, '[ETRA-VRTR-MIB::vRtrIfName.]'));

    // By the following if statement, I try to eliminate the warnings by 
    // checking if both values exist.
    if ( $newkey && $newval ) {
        $newArray = array_combine($newkey, $newval);

        // Finally to further eliminate the warnings, I try to make sure that the
        // $newArray has been created.
        if ( $newArray ) {
            $Array = array_merge($Array, $newArray);
        }
    }
}

$data = $Array;

print_r($data);

上面代码在我的本地环境中的输出是这样的:

在此处输入图像描述

所以,如果仍然有错误,那么也许你必须检查函数的实际输出是什么snmp3_real_walk,因为它可能会返回一些意想不到的结果。

希望这段代码对您有所帮助。


推荐阅读