-4

我有数组

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,但无法达到目标。有什么建议么?

更新。

我不需要迭代。仅直接array_*函数。

4

4 回答 4

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
)
于 2013-04-05T08:53:38.277 回答
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

于 2013-04-05T08:27:58.157 回答
0

恐怕你在问不可能的事。您的最终数组包含两个相同值的键(巧合的是,每个键都具有相同的值)。数组必须具有不同值的键,否则它们将简单地相互覆盖。

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

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

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

您可以使用此行获得最终数组:

$finalArray = $forwardDiff + $backwardDiff;
于 2013-04-05T08:28:43.157 回答
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];
}

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

于 2013-04-05T08:29:01.007 回答