合并数组时不丢失键索引

19

我有两个数组

/**
 * Menu Navigation
 * @var array
 */
public $nav_top = array(
    100 => 'Dashboard',
    200 => 'Sell',
    300 => 'Products',
    400 => 'History',
    500 => 'Customers',
    600 => 'Setup'
);

/**
 * Menu Navigation
 * @var array
 */
public $nav_sub = array(
    201 => 'Current Sale',
    202 => 'Retrieve Sale',
    203 => 'Close Register',

    301 => 'Product',
    302 => 'Stock Control',
    303 => 'Price Books',
    304 => 'Types',
    305 => 'Suppliers',
    306 => 'Brands',
    307 => 'Tags',

    501 => 'Customer',
    502 => 'Group'
);
如何将这两个数组组合在一起,而不会失去它们的关键索引?
如果使用array_merge()函数,则索引将从零重新开始。
$nav = array_merge($Class->nav_top, $Class->nav_sub);
var_dump($nav);

# Output:
array(
    0 => 'Current Sale',
    1 => 'Retrieve Sale',
    2 => 'Close Register',
    .......
);

期望结果是数组键仍然相同。

# Expected Output
array(
    100 => 'Dashboard',
    200 => 'Sell',
    300 => 'Products',
    ........
);
2个回答

66

我能想到的最简单方法:

$combined = $nav_top + $nav_sub;

一个例子


1
+1 我从来不知道 + 可以用在数组上.. 你确定这不是个 bug... 哈哈 - Baba
2
@Baba没有bug。真的 :-) http://www.php.net/manual/zh/language.operators.array.php - jeroen
@Baba,这根本不是一个错误,而且已经记录在案大约十年了。 - salathe
谢谢,这节省了我的时间。 - Bhavin Thummar
请注意顺序。使用 array_merge($a,$b)$b 中的键将覆盖 $a 中匹配的键。而使用 $a+$b$b 中的键不会覆盖 $a 中匹配的键,但它们将被忽略。这在以下示例中有解释:https://www.php.net/manual/en/function.array-merge.php#example-5418 - Jules Colle

1

我的建议

使用jeroen的解决方案

艰难的出路

$combined  = merge($nav_top,$nav_sub);

函数

function merge($arr1,$arr2)
{
    if(!is_array($arr1))
        $arr1 = array();
    if(!is_array($arr2))
        $arr2 = array();
    $keys1 = array_keys($arr1);
    $keys2 = array_keys($arr2);
    $keys  = array_merge($keys1,$keys2);
    $vals1 = array_values($arr1);
    $vals2 = array_values($arr2);
    $vals  = array_merge($vals1,$vals2);
    $ret    = array();

    foreach($keys as $key)
    {
        list($unused,$val) = each($vals);
        $ret[$key] = $val;
    }

    return $ret;
}

或者

function merge($a1, $a2) {

    $aRes = $a1;
    foreach ( array_slice ( func_get_args (), 1 ) as $aRay ) {
        foreach ( array_intersect_key ( $aRay, $aRes ) as $key => $val )
            $aRes [$key] += $val;
        $aRes += $aRay;
    }
    return $aRes;
}

演示:http://codepad.org/9B8V96Gf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接