需要组合具有相同键的PHP数组项

时间:2012-11-29 13:29:08

标签: php arrays

[0] => Array
        (
            [2148] => 2
            [2149] => 1
            [2150] => 0
        )
[1] => Array
        (
            [2148] => 4
            [2119] => 1
            [2130] => 0
        )

所以这样的事情会很棒:

[array_complete] => Array
        (
            [2148] => array(2,4)
            [2149] => 1
            [2150] => 0
            [2119] => 1
            [2130] => 0
        )

研究数组推送等但不完全确定。

3 个答案:

答案 0 :(得分:1)

很简单,如果你使用的是关联数组,请使用array_merge_recursive。这是文档:http://www.php.net/manual/en/function.array-merge-recursive.php

$array_complete = array_merge_recursive($array[0], $array[1]);

由于您使用的是索引数组,因此您需要创建自定义内容。这是我扔在一起对你有用的东西(注意它只适用于带有标量值的一维数组):

$array_complete = array_merge_recursive_indexed($array[0], $array[1]);

function array_merge_recursive_indexed($a1, $a2) {
    $merged = array();
    $keys = array_merge(array_keys($a1), array_keys($a2));
    foreach ($keys as $key) {
        if (isset($a1[$key])) {
            if (isset($a2[$key])) {
                $merged[$key] = array($a1[$key], $a2[$key]);
            } else {
                $merged[$key] = $a1[$key];
            }
        } else if (isset($a2[$key])) {
            $merged[$key] = $a2[$key];
        }
    }
    return $merged;
}

答案 1 :(得分:0)

将数组键转换为非数字键后使用array_merge_recursive。如果你按原样使用它,冲突键将只是重新编号。

总的来说:

$arr1 = array("a2148"=> 2, "a2149" => 1, "a2150" => 0);
$arr2 = array("a2148" => 4,"a2119" => 1, "a2130" => 0);
var_dump(array_merge_recursive($arr1,$arr2));

输出:

array(5) {
  ["a2148"]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    int(4)
  }
  ["a2149"]=>
  int(1)
  ["a2150"]=>
  int(0)
  ["a2119"]=>
  int(1)
  ["a2130"]=>
  int(0)
}

以下是演示:http://codepad.org/k8zvK0nL

答案 2 :(得分:0)

试试这个

$array1 = array(2148 => 2, 2149 => 1 , 2150 => 0, 1234 => 3);
$array2 = array(2148 => 4, 2149 => 1 , 2150 => 0, 123=> 3);

$res = array();


function merge($array1, $array2, array &$res = null) {
    $loop = false;
    if(null == $res) {
        $res = array();
        $loop = true;
    }
    foreach($array1 as $key => $val) {
        if(false == array_key_exists($key, $array2) || $array2[$key] == $val) {
            $res[$key] = $val;
        }
        else {
            if(array_key_exists($key, $res) && false == is_array($res[$key])) {
                $res[$key] = array($res[$key]);
            }
            $res[$key][] = $val;
        }
    }

    if(true === $loop) {
        return merge($array2, $array1, $res);
    }

    return $res;
}

print_r(merge($array1, $array2));exit;