Php 如何添加两个多维数组的合并子数组

Php 如何添加两个多维数组的合并子数组,php,arrays,multidimensional-array,array-merge,sub-array,Php,Arrays,Multidimensional Array,Array Merge,Sub Array,很抱歉问了这么简单的问题,但我对PHP还是新手。 我正在尝试添加此数组中的isInStock键和值: $stock数组: 并根据variantId值(如果两者都匹配)将它们放入每个大小的数组中 $data数组: 我已经尝试解决这个问题有一段时间了,但我一直被卡住。我可以分配单个值,但不能让它完成整个数组。任何帮助都将不胜感激 我希望生成的数组如下所示: Array ( [0] => Array ( [name] => name 1

很抱歉问了这么简单的问题,但我对PHP还是新手。 我正在尝试添加此数组中的isInStock键和值:

$stock数组:

并根据variantId值(如果两者都匹配)将它们放入每个大小的数组中

$data数组:

我已经尝试解决这个问题有一段时间了,但我一直被卡住。我可以分配单个值,但不能让它完成整个数组。任何帮助都将不胜感激

我希望生成的数组如下所示:

Array
(
    [0] => Array
        (
            [name] => name 1 
            [price] => 45.00
            [colour] => Neon yellow
            [image] => http://url
            [url] => http://url1
            [productid] => 7985894
            [variants] => Array
                (
                    [0] => Array
                        (
                            [variantId] => 7986029
                            [size] => US 0
                            [isInStock] => 1
                        )    
                    [1] => Array
                        (
                            [variantId] => 7986070
                            [size] => US 2
                            [isInStock] => 1
                        )    
                    [2] => Array
                        (
                            [variantId] => 7985916
                            [size] => US 4
                            [isInStock] => 1
                        )    
                    [3] => Array
                        (
                            [variantId] => 7985929
                            [size] => US 6
                            [isInStock] => 1
                        )    
                    [4] => Array
                        (
                            [variantId] => 7985918
                            [size] => US 8
                            [isInStock] => 1
                        )    
                    [5] => Array
                        (
                            [variantId] => 7985935
                            [size] => US 10
                            [isInStock] => 1
                        )    
                    [6] => Array
                        (
                            [variantId] => 7985945
                            [size] => US 12
                            [isInStock] => 1
                        )    
                    [7] => Array
                        (
                            [variantId] => 7985994
                            [size] => US 14
                            [isInStock] => 1
                        )    
                )    
        )    
    [1] => Array
        (
            [name] => name 1
            [price] => 45.00
            [colour] => Multi
            [image] => http://url
            [url] => http://url
            [productid] => 8040851
            [variants] => Array
                (
                    [0] => Array
                        (
                            [variantId] => 8040898
                            [size] => US 0
                            [isInStock] => 1
                        )    
                    [1] => Array
                        (
                            [variantId] => 8041115
                            [size] => US 2
                            [isInStock] => 1
                        )    
                    [2] => Array
                        (
                            [variantId] => 8040904
                            [size] => US 4
                            [isInStock] => 1
                        )    
                    [3] => Array
                        (
                            [variantId] => 8041132
                            [size] => US 6
                            [isInStock] => 1
                        )    
                    [4] => Array
                        (
                            [variantId] => 8041015
                            [size] => US 8
                            [isInStock] => 1
                        )    
                    [5] => Array
                        (
                            [variantId] => 8040942
                            [size] => US 10
                            [isInStock] => 1
                        )    
                    [6] => Array
                        (
                            [variantId] => 8040954
                            [size] => US 12
                            [isInStock] => 1
                        )    
                    [7] => Array
                        (
                            [variantId] => 8040990
                            [size] => US 14
                            [isInStock] => 1
                        )    
                )    
        )
到目前为止,我尝试了array_merge,它没有将值放在正确的位置。
我尝试过这个$data['isInstock']=$stock[0]['variants'][0]['variantId'];这也行不通。

遗憾的是,要让两个数组准备好与array\u merge\u recursive一起使用,需要相当多的迭代/准备工作。我承认,我对我的方法中的卷积不感到自豪。所有这一切的主要因素是,array\u merge\u recursive只能很好地处理非数字索引,因此我必须用数组中的相对id值替换数字索引键。我会尽我最大的努力解释我的步骤,但再一次,这并不漂亮

步骤1:准备$stock数组:

步骤2:准备$data数组并合并:

foreach($data as $subarray){
    $new_data["#{$subarray['productid']}"]=$subarray;  // replace outer key
    $new_variants=[];                                  // declare a fresh array
    foreach($subarray['variants'] as $varsub){
        $new_variants["#{$varsub['variantId']}"]=$varsub; // both elements from variants
    }
    $new_data["#{$subarray['productid']}"]['variants']=array_values(array_merge_recursive($new_variants,$new_stock["#{$subarray['productid']}"]['variants']));
    // new variants subarray has been merged, re-indexed, and written to $new_data
}
步骤3:重新索引外部数组键,并显示:

$result=array_values($new_data);    
var_export($result);
数组准备的主要任务是为$stock和$data中的外部和内部数组生成唯一的id。这允许数组_merge隔离相关的productId并递归地合并变量元素

如果这两个数组是从数据库生成的,那么我的主要建议是利用可用的数据库功能来合并这些数据,而不是php


下面是一个简单的例子,说明数组\u merge\u recursive是如何工作的。使用任意一个数组中的键进行实验。如果您甚至从数字字符串中删除了,那么array\u merge\u recursive将假定它处理的是数字索引并将其切碎。我将id保留为字符串的技术是在字符串前加上前缀,但可以通过在键值中添加任意一个非数字字符来实现。

您到底在尝试什么?除了展示你所期望的结果之外,还要展示你迄今为止所做的尝试——以及你遇到的困难。你应该养成这样的习惯,它为你提供了最好的解决方案。这个网站是双向的,如果你不回馈那些帮助你的人,你将来就不会得到太多帮助。在你指出答案之前,我不知道如何接受答案。我希望随着我的进步,我将来也能帮助别人。到目前为止,我已经尝试了array\u merge、array\u combine和array\u push。@adamp$stock和$data的长度是否总是相同的?或者其中一个阵列可能有更多的子阵列?如果其中一个始终等于或大于另一个,则此信息在该过程中非常重要。另外,$stock实际上需要productid和productid吗?这似乎是一个可以忽略的简单冗余。
foreach($stock as $subarray){
    $new_stock["#{$subarray['productid']}"]=$subarray;  // replace outer key
    $new_variants=[];                                   // declare a fresh array
    foreach($subarray['variants'] as $varsub){
        $new_variants["#{$varsub['variantId']}"]['isInStock']=$varsub['isInStock'];  // one element only
        // omitting variantId element this time as the next array will offer it.
    }
    $new_stock["#{$subarray['productid']}"]['variants']=$new_variants;
}
foreach($data as $subarray){
    $new_data["#{$subarray['productid']}"]=$subarray;  // replace outer key
    $new_variants=[];                                  // declare a fresh array
    foreach($subarray['variants'] as $varsub){
        $new_variants["#{$varsub['variantId']}"]=$varsub; // both elements from variants
    }
    $new_data["#{$subarray['productid']}"]['variants']=array_values(array_merge_recursive($new_variants,$new_stock["#{$subarray['productid']}"]['variants']));
    // new variants subarray has been merged, re-indexed, and written to $new_data
}
$result=array_values($new_data);    
var_export($result);