如何正确使用array_diff_key?

时间:2013-04-05 08:21:40

标签: php arrays

我有阵列

array (
  500 => 
  array (
    1 => 1,
    6 => 2,
    2 => 1,
  ),
  550 => 
  array (
    3 => 1,
    6 => 2,
    4 => 1,
    5 => 1,
  ),
)

我怎样才能得到下一个结果?

array(
    1 => 1,
    2 => 1,
    3 => 1,
    4 => 1,
    5 => 1,
)

我正在尝试使用array_diff_key / array_intersect_key,但无法实现目标。 有什么建议吗?

UPD。

我不需要迭代。仅限直接array_*个功能。

4 个答案:

答案 0 :(得分:1)

你可能正在寻找联盟和关键交叉点的关键区别:

$array = array_diff_key(
    ($a = $array['500']) + ($b = $array['550']), 
    array_intersect_key($a, $b)
);

对于您的输入数组,这将提供所需的输出(Demo):

Array
(
    [1] => 1
    [2] => 1
    [3] => 1
    [4] => 1
    [5] => 1
)

答案 1 :(得分:0)

<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_key($array1, $array2));
?>

以上示例将输出:

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

参考 http://php.net/manual/en/function.array-diff-key.php

答案 2 :(得分:0)

我担心你会问不可能的事情。您的最终数组包含两个具有相等值的键(并且每个键具有相同的值,巧合)。数组必须具有不同值的键,否则它们将简单地相互覆盖。

// impossible:
$ar = array(
  1 => 1,
  // ...
  1 => 1 // this value would overwrite the first
);

说过很难理解第一个和第二个数组之间的关系是什么,所以我无法给出更好的答案。

编辑:斯科恩的答案是正确的(https://stackoverflow.com/a/15829227/932508)。

您可以使用以下行获取最终数组:

$finalArray = $forwardDiff + $backwardDiff;

答案 3 :(得分:0)

这应该有效

$foo = array (
  500 => 
  array (
    1 => 1,
    6 => 2,
    2 => 1,
  ),
  550 => 
  array (
    3 => 1,
    6 => 2,
    4 => 1,
    5 => 1,
  ),
);

$bar = array();
$forwardDiff = array_diff_key($foo[500], $foo[550]);
$backwardDiff = array_diff_key($foo[550], $foo[500])
foreach (array_merge($forwardDiff, $backwardDiff) as $key) {
  $bar = isset($foo[500][$key]) ? $foo[500][$key] : $foo[550][$key];
}

编辑:修复错误的合并功能..