2个数组:只保留具有不同值的元素

2 arrays: keep only elements with different value

我有 2 个数组:

Array
(
    [0] => Array
        (
            [id] => 1
            [fieldname] => banana
            [value] => yellow
        ) 
)

Array
(
    [0] => Array
        (
            [id] => 1
            [fieldname] => rome
            [value] => city
        )

    [1] => Array
        (
            [id] => 2
            [fieldname] => bla
            [value] => yes
        )
)

我想创建一个新数组,其中只包含 "id" 不同的元素。换句话说,我想得到这个输出:

Array
(
    [0] => Array
        (
            [id] => 2
            [fieldname] => bla
            [value] => yes
        )

)

[id] => 2 是唯一不同的 [id] 所以我保留它。

说我已经通过一堆低效的 foreach、if 语句和临时变量实现了我的目标。我真的不想为这个非常小的东西使用一大堆代码,所以我开始寻找一个原生的 PHP 函数,但没有成功。获得结果的最简单方法是什么?有没有可能我严格需要使用带有这么多 if 的 foreach?

这应该可以做到。不是很短,它确实使用了一个临时变量,所以可能不是你想要的。我将这两个数组命名为 onetwo.

$ids = array();
$result = array();

foreach ($one as $x) {
    $ids[$x['id']] = 1; //This way, isset($x['id']) vill return true
}

foreach ($two as $x) {
    if (!isset($ids[$x['id']])) {
        $result[] = $x;
    }
}

如果没有更紧凑的方法,我会感到惊讶。

编辑: 这是每个嵌套的替代变体。也不是特别短。

$result = array();

foreach ($one as $x) {
    foreach ($two as $y) {
        if ($x['id'] == $y['id']) {
            //A match, lets try the next $x
            continue 2;
        }
    }
    //No matching id in $two
    $result[] = $x;
}

您可以将 array_udiff 与函数一起使用。

Computes the difference of arrays by using a callback function for data comparison.

Returns an array containing all the values of the first array that are not present in any of the other arguments.


代码:

// Setup two arrays as per your question
$array1 = array (

  '0' => array (
    'id' => '1',
    'fieldname' => 'banana',
    'value' => 'yellow',
  )

);

$array2 = array (

  '0' => array (
    'id' => '1',
    'fieldname' => 'rome',
    'value' => 'city',
  ),

  '1' => array (
    'id' => '2',
    'fieldname' => 'bla',
    'value' => 'yes',
  )

);

// Setup the callback comparison function
function arrayCompare($array2, $array1) {
    return $array2['id'] - $array1['id'];
}

// Use array_udiff() with the two arrays and the callback function
$arrayDiff = array_udiff($array2, $array1, 'arrayCompare');
print_r($arrayDiff);

以上代码returns如下:

Array (

  [1] => Array (
    [id] => 2
    [fieldname] => bla
    [value] => yes
  )

)