我如何比较下面的二维数组?

时间:2016-07-01 16:06:37

标签: php arrays multidimensional-array

我需要基于'值'的数组2中不存在的数组1的元素。仅限关键。

数组1

$array1 = array(
     array('value' => 113214, 'revision_id' => 2047152),
     array('value' => 236462, 'revision_id' => 2045678),
     array('value' => 236541, 'revision_id' => 2047155)
);

ARRAY2

$array2 = array(
    array('value' => 113214, 'revision_id' => 2047152),
    array('value' => 236461, 'revision_id' => 2047153),
    array('value' => 236541, 'revision_id' => 2047155)
);

我需要输出如下,数组的差异应该基于值

$output = array(
    array('value' => 236462, 'revision_id' => 2045678)
);

4 个答案:

答案 0 :(得分:1)

只需做一个嵌套的foreach循环并检查条件希望它可以帮助你:

$arraycheck= array();

foreach($newData as $data1) {

  $duplicatecheck = false;
  foreach($oldData as $data2) {
    if($data1['value'] === $data2['value'] && $data1['revision_id'] === $data2['revision_id']) $duplicatecheck = true;
  }

  if($duplicatecheck === false) $arraycheck[] = $data1;
}

答案 1 :(得分:1)

您可以使用接受上一个参数作为回调的array_udiff,并且可以轻松定义您的比较。

$array1 = [
    ['value' => '113214', 'revision_id' => '2047152'],
    ['value' => '236462', 'revision_id' => '2045678'],
    ['value' => '236541', 'revision_id' => '2047155'],
];
$array2 = [
    ['value' => '113214', 'revision_id' => '2047152'],
    ['value' => '236461', 'revision_id' => '2047153'],
    ['value' => '236541', 'revision_id' => '2047155'],
];

$result = array_udiff ($array1, $array2, function($x, $y) {
    return $x['value'] - $y['value'];
});
print_r($result);

答案 2 :(得分:1)

首先,使用array_column获取值'值'从array2到一维数组:

$a2values = array_column($array2, 'value');

然后将这些值用于array_filter array1。

$result = array_filter($array1, function($item) use ($a2values) {
    // only keep items with values not in array2
    return !in_array($item['value'], $a2values);
});

答案 3 :(得分:0)

取自:https://gist.github.com/wrey75/c631f6fe9c975354aec7

function my_array_diff($arr1, $arr2) {
    $diff = array();

    // Check the similarities
    foreach( $arr1 as $k1=>$v1 ){
        if( isset( $arr2[$k1]) ){
            $v2 = $arr2[$k1];
            if( is_array($v1) && is_array($v2) ){
                // 2 arrays: just go further...
                // .. and explain it's an update!
                $changes = self::diff($v1, $v2);
                if( count($changes) > 0 ){
                    // If we have no change, simply ignore
                    $diff[$k1] = array('upd' => $changes);
                }
                unset($arr2[$k1]); // don't forget
            }
            else if( $v2 === $v1 ){
                // unset the value on the second array
                // for the "surplus"
                unset( $arr2[$k1] );
            }
            else {
                // Don't mind if arrays or not.
                $diff[$k1] = array( 'old' => $v1, 'new'=>$v2 );
                unset( $arr2[$k1] );
            }
        }
        else {
            // remove information
            $diff[$k1] = array( 'old' => $v1 ); 
        }
    }

    // Now, check for new stuff in $arr2
    foreach( $arr2 as $k=>$v ){
        // OK, it is quite stupid my friend
        $diff[$k] = array( 'new' => $v );
    }
    return $diff;
}

用法:

$diff = my_array_diff($arr1, $arr2);
var_dump($diff);