2

我有两个带有数字键的数组。这是一个小例子:

$test_a = array(1 => 'one', 2 => '二');
$test_b = array(2 => 'two', 4 => 'four');

我想将它们与 合并array_merge()以接收$test_c数组:

$test_c = array(
    1 => 'one',
    2 => 'two',
    4 => 'four'
);

该手册array_merge提到:

带有数字键的输入数组中的值将使用从结果数组中的零开始的递增键重新编号。

似乎是真的,因为:

$test_c = array_merge($test_a, $test_b);
var_dump($test_c);

返回:

array (size=4)
    0 => string 'one' (length=3)
    1 => string '二' (length=3)
    2 => string 'two' (length=3)
    3 => string 'four' (length=4)

我尝试了什么:

  1. 我尝试将键转换为字符串:

    foreach($test_a as $key => $value) $test_a[(string)($key)] = $value;
    

    ...键仍然是数字。

  2. 我试过strval()

    foreach($test_a as $key => $value) $test_a[strval($key)] = $value;
    

    不用找了。键仍然是数字。

  3. 我试过这个技巧:

    foreach($test_a as $key => $value) $test_a['' . $key . ''] = $value;
    

    也不行。键仍然是数字。

令我惊讶的是,当我发现数组键上有从字符串到数字的自动转换之类的东西时。这将键更改为字符串:

foreach($test_a as $key => $value) $test_a[' ' . $key . ' '] = $value;

当我添加时trim()

foreach($test_a as $key => $value) $test_a[trim(' ' . $key . ' ')] = $value;

键被转换回数字。

基本上,我想合并这两个数组。我想唯一的解决方案是找到一种将键从数字转换为字符串数据类型的方法。
如果你能额外解释一下“自动转换”的事情,那我就完全满意了。

4

2 回答 2

3

您可以+在两个数组上使用运算符,如下所示:

$test_a = array(1 => 'one', 2 => '二');
$test_b = array(2 => 'two', 4 => 'four');

var_dump( $test_b + $test_a);

将输出

array(3) {
  [2]=>
  string(3) "two"
  [4]=>
  string(4) "four"
  [1]=>
  string(3) "one"
}

它不是您要查找的确切顺序,但您可以使用ksort()按键排序以获得准确的输出。您所说的“自动转换”实际上称为类型强制,在 PHP中称为类型杂耍。

于 2012-07-05T12:58:54.917 回答
0

简单地说,我这样做了:

foreach($new as $k => $v)
{
    $old[$k] = $v;
}
// This will overwrite all values in OLD with any existing
// matching value in NEW
// And keep all non matching values from OLD intact.
// No reindexing, and complete overwrite
// Working with all kind of data
于 2012-11-15T14:48:09.610 回答