Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php,array\u merge\u recursive仅适用于字符串键_Php - Fatal编程技术网

php,array\u merge\u recursive仅适用于字符串键

php,array\u merge\u recursive仅适用于字符串键,php,Php,结果是: $array1 = [ '1' => '11', 'b' => 1, 3 => 33, 8 => 8 ]; $array2 = [ '1' => '22', 'b' => 2, 3 => 44, 9 => 9 ]; $merged = array_merge_recursive($array1, $array2); 让我们看一下:唯一的部分是'b'键,它们

结果是:

$array1 = [
    '1' => '11',
    'b' => 1,
    3   => 33,
    8   => 8
];
$array2 = [
    '1' => '22',
    'b' => 2,
    3   => 44,
    9   => 9
];

$merged = array_merge_recursive($array1, $array2);
让我们看一下:唯一的部分是
'b'
键,它们实际上是有效的。我不想覆盖它的任何内容,而是将它们组合成一个数组。太好了!但是其他的数字键(int或string)都被弄错了。 我希望得到以下结果:

array(7) {
  [0]=>
  string(2) "11"
  ["b"]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(2)
  }
  [1]=>
  int(33)
  [2]=>
  int(8)
  [3]=>
  string(2) "22"
  [4]=>
  int(44)
  [5]=>
  int(9)
}
可能吗


编辑:当然键“1”和1-string与int键是相同的

让我们把这个问题分解成不同的问题:

  • 当第二个数组中的键存在于第一个数组中时,您希望创建一个数组,并使该值成为该数组的第一个元素
  • 老实说,我不知道解决这个问题的简单方法。我不确定有没有。即使如此,我也不确定你是否真的想要它。这样的函数将导致数组的值为字符串或数组。您将如何处理这样的数组

    更新:嗯,有一个。您的示例已经显示
    array\u merge\u recursive
    将使用字符串键将值转换为数组。所以
    1=>'foo'
    将是
    0=>'foo'
    ,但是
    'foo'=>'bar'
    将最终成为
    'foo'=>['bar']
    。我真的不明白这种行为

    在这种情况下,使用字符串键会对您有所帮助,但在了解了更多有关
    数组\u合并\u递归的内容后,我决定尽可能避免使用此函数。我问过有人把它作为一个文件归档,因为它在PHP5.x中的工作方式不同

  • 您希望保留关键点,而
    array\u merge\u resursive
    不保留整数关键点,而保留整数关键点:
  • 如果输入数组具有相同的字符串键,则 这些键被合并到一个数组中,这就完成了 递归地,因此如果其中一个值是数组本身,则 函数将它与另一个数组中的对应项合并 也但是,如果数组具有相同的数字键,则后面的 值不会覆盖原始值,但将被追加

    更糟糕的是,在处理嵌套数组时,它的处理方式不同:

    [
      '1' => ['11', '22']
      'b' => [1, 2]
      [3] => [33, 44]
      [8] => 8,
      [9] => 9
    ]
    
    因此,实际上,
    array\u merge\u resursive
    并不是真正的resursive

    使用可解决此问题:

        $array1 = [30 => [500 => 'foo', 600 => 'bar']];
        $array2 = [];
        array_merge_recursive($array1, $array2);
        //[0 => [500=> 'foo', 600 => 'bar']];
    

    请注意,PHP在不一致性方面是非常一致的。虽然
    array\u merge\u recursive
    不是递归的,
    array\u replace\u recursive
    不会替换(它还附加了以下内容):

    如果密钥存在于第二个数组中,而不是第一个数组中,则它将被删除 在第一个数组中创建


    在很多情况下,这是期望的行为,因为命名函数不是PHP的最强点,所以您可以将其视为一个次要问题。

    这是预期的行为:如果输入数组具有相同的字符串键,那么这些键的值将合并为一个数组。但是,如果数组具有相同的数字键,则后面的值将不会覆盖原始值,而是会被追加。您可能必须手动执行此操作,而不是使用内置函数。这完全不同…不完全是这样
    array\u replace\u recursive
    并不总是追加。根据文档,
    当第一个数组中的值是标量时,它将被第二个数组中的值替换,可以是标量或数组。当第一个数组和第二个数组中的值都是数组时,array_replace_recursive()将递归地替换它们各自的值
    对于OP的这个示例,
    $array1['b']
    $array2['b']
    的值都是
    数组
    ,因此它在那里工作正常。看看结果中的其他元素,
    Scalar
    Scalar
    替换,并创建了任何不存在的键。“请注意,PHP在不一致性方面非常一致”-哈哈!
    array_replace_recursive($array1, $array2);
    //output: 
    //array:5 [
    //  1 => "22"
    //  "b" => 2
    //  3 => 44
    //  8 => 8
    //  9 => 9
    //]