将Array与多行进行比较

时间:2013-12-17 09:48:40

标签: php arrays

我正在尝试比较2个阵列并在单独的数组中输出差异。

我已经制作了以下代码行来比较2个数组;

$INPUTdifference = array_udiff($userINPUT, $iptablesINPUT, function ($userINPUT, $iptablesINPUT) { return (int) ($userINPUT != $iptablesINPUT); });

userINPUT包含一行进行测试,而iptablesINPUT包含一行时,它可以完美运行。

但是,每当我在userINPUT数组中添加第二行时,它就会完全停止工作。当我打印INPUTdifference anymore

时,它甚至不提供任何内容

这里有什么问题?

EDIT;

获取userINPUT的方式;

function getIPTablesINPUT() {


    /* ------------------------------ */
    // INPUT CHAIN
    /* ------------------------------ */



    $INPUTCOMMAND = popen('/usr/bin/sudo /sbin/iptables -L INPUT -nvx --line-numbers | tail -n +3', 'r');
    $INPUTcontent = '';
    while (!feof($INPUTCOMMAND)) {
        $INPUTcontent .= fread($INPUTCOMMAND, 4096);
    }
    pclose($INPUTCOMMAND);
    $INPUTlines = explode("\n", trim($INPUTcontent));
    $INPUTresults = array();
    $INPUTcounter = 0;


    foreach ($INPUTlines as $line) {


        $segments = preg_split('/[\s]+/', $line);


        $INPUTArray = array(
            'num' => $segments[0],
            'pkts' => $segments[1],
            'bytes' => $segments[2],
            'target' => $segments[3],
            'prot' => $segments[4],
            'opt' => $segments[5],
            'in' => $segments[6],
            'out' => $segments[7],
            'source' => $segments[8],
            'destination' => $segments[9]
        );


        array_push($INPUTresults, $INPUTArray);

        $INPUTcounter++;
    }

    return $INPUTresults;
}

然后,在函数之外

$iptablesINPUT  = getIPTablesINPUT();

然后,数据中规则的方式

$dbconnection = pg_connect("host=x port=x dbname=x user=x password=xxxx") or die("Unable to connect to Postgres");


    // INPUT table from userDB
    $userINPUTresult = pg_query($dbconnection, "SELECT * FROM \"INPUT\"");
    if (pg_affected_rows($userINPUTresult) === 1) {

        $userINPUTArray = pg_fetch_all($userINPUTresult);
        echo "INPUT CHAIN RULES LOADED \n";
    } else {

        echo ("NO INPUT CHAIN RULES \n");
    }

==== VAR DUMPS ====

var_dump $ iptablesINPUT

NULL
array(2) {
  [0]=>
  array(10) {
    ["num"]=>
    string(1) "1"
    ["pkts"]=>
    string(1) "0"
    ["bytes"]=>
    string(1) "0"
    ["target"]=>
    string(4) "DROP"
    ["prot"]=>
    string(3) "all"
    ["opt"]=>
    string(2) "--"
    ["in"]=>
    string(1) "*"
    ["out"]=>
    string(1) "*"
    ["source"]=>
    string(9) "192.0.0.1"
    ["destination"]=>
    string(9) "0.0.0.0/0"
  }
  [1]=>
  array(10) {
    ["num"]=>
    string(1) "2"
    ["pkts"]=>
    string(1) "0"
    ["bytes"]=>
    string(1) "0"
    ["target"]=>
    string(4) "DROP"
    ["prot"]=>
    string(3) "all"
    ["opt"]=>
    string(2) "--"
    ["in"]=>
    string(1) "*"
    ["out"]=>
    string(1) "*"
    ["source"]=>
    string(9) "192.0.0.2"
    ["destination"]=>
    string(9) "0.0.0.0/0"
  }
}

var_dump $ userINPUT

NULL

显然这是出现问题的地方......

====编辑2 ======

这是我从函数中提取数组的方式。

// Slice up userDB arrays for comparing
$userINPUT = $allRules[0];
$userOUTPUT = $allRules[1];
$userFORWARD = $allRules[2];
$userPOSTROUTING = $allRules[3];
$userPREROUTING = $allRules[4];

1 个答案:

答案 0 :(得分:1)

array_udiff函数返回第一个数组中不在下一个数组中的元素。

来自array_udiff page

  

array array_udiff(array $ array1,array $ array2 [,array $ ...],callable $ value_compare_func)

     

返回一个数组,其中包含 array1 的所有值,这些值在任何其他参数中都不存在

由于您的第一个数组(在您的情况下为$userINPUT)的值为null,因此array_udiff的结果也将为null

执行以下代码后查看

$a = array(1,2);
$b = array(1);
$c = array_udiff($a, $b, function($a, $b){return (int) $a != $b;});

// $c == array(2) now

$c的值将为array(2),因为以下代码

$a = null;
$b = array(1);
$c = array_udiff($a, $b, function($a, $b){return (int) $a != $b;});

// $c == null now

将导致$c等于null