简体   繁体   English

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

[英]How to add merge subarrays of two multi-dimensional arrays

Sorry about such an easy question but I am new to PHP. 抱歉,这个问题很简单,但是我是PHP新手。 I am trying to add the isInStock keys and values from this array: 我正在尝试从此数组添加isInStock键和值:

$stock array: $stock数组:

Array
(
    [0] => Array
        (
            [name] => name of item 1
            [price] => 45.00
            [colour] => Neon yellow
            [image] => http://images1
            [url] => http://url1
            [productid] => 7985894
            [variants] => Array
                (
                    [0] => Array
                        (
                            [variantId] => 7986029
                            [isInStock] => 1
                        )
                    [1] => Array
                        (
                            [variantId] => 7986070
                            [isInStock] => 1
                        )
                    [2] => Array
                        (
                            [variantId] => 7985916
                            [isInStock] => 1
                        )
                    [3] => Array
                        (
                            [variantId] => 7985929
                            [isInStock] => 1
                        )

                    [4] => Array
                        (
                            [variantId] => 7985918
                            [isInStock] => 1
                        )
                    [5] => Array
                        (
                            [variantId] => 7985935
                            [isInStock] => 1
                        )
                    [6] => Array
                        (
                            [variantId] => 7985945
                            [isInStock] => 1
                        )
                    [7] => Array
                        (
                            [variantId] => 7985994
                            [isInStock] => 1
                        )
                )
            [productId] => 7985894
        )
    [1] => Array
        (
            [name] => name of item 2
            [price] => 45.00
            [colour] => Multi
            [image] => http://images
            [url] => http://url
            [productid] => 8040851
            [variants] => Array
                (
                    [0] => Array
                        (
                            [variantId] => 8040898
                            [isInStock] => 1
                        )
                    [1] => Array
                        (
                            [variantId] => 8041115
                            [isInStock] => 1
                        )
                    [2] => Array
                        (
                            [variantId] => 8040904
                            [isInStock] => 1
                        )
                    [3] => Array
                        (
                            [variantId] => 8041132
                            [isInStock] => 1
                        )
                    [4] => Array
                        (
                            [variantId] => 8041015
                            [isInStock] => 1
                        )
                    [5] => Array
                        (
                            [variantId] => 8040942
                            [isInStock] => 1
                        )
                    [6] => Array
                        (
                            [variantId] => 8040954
                            [isInStock] => 1
                        )
                    [7] => Array
                        (
                            [variantId] => 8040990
                            [isInStock] => 1
                        )
                )
            [productId] => 8040851
        )

and put them in this array under each size according to the variantId value if they both match. 如果它们都匹配,则根据variantId值将它们放在此数组的每个size下。

$data array: $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
                        )
                    [1] => Array
                        (
                            [variantId] => 7986070
                            [size] => US 2
                        )
                    [2] => Array
                        (
                            [variantId] => 7985916
                            [size] => US 4
                        )
                    [3] => Array
                        (
                            [variantId] => 7985929
                            [size] => US 6
                        )
                    [4] => Array
                        (
                            [variantId] => 7985918
                            [size] => US 8
                        )
                    [5] => Array
                        (
                            [variantId] => 7985935
                            [size] => US 10
                        )
                    [6] => Array
                        (
                            [variantId] => 7985945
                            [size] => US 12
                        )
                    [7] => Array
                        (
                            [variantId] => 7985994
                            [size] => US 14
                        )
                )
        )
    [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
                        )
                    [1] => Array
                        (
                            [variantId] => 8041115
                            [size] => US 2
                        )
                    [2] => Array
                        (
                            [variantId] => 8040904
                            [size] => US 4
                        )
                    [3] => Array
                        (
                            [variantId] => 8041132
                            [size] => US 6
                        )
                    [4] => Array
                        (
                            [variantId] => 8041015
                            [size] => US 8
                        )
                    [5] => Array
                        (
                            [variantId] => 8040942
                            [size] => US 10
                        )
                    [6] => Array
                        (
                            [variantId] => 8040954
                            [size] => US 12
                        )
                    [7] => Array
                        (
                            [variantId] => 8040990
                            [size] => US 14
                        )
                )
        )

I have been trying to solve this for a while now, but I keep getting stuck. 我已经尝试解决了一段时间了,但是我一直陷于困境。 I can assign individual values but can't get it to do the whole array. 我可以分配单个值,但不能让它完成整个数组。 Any help would be appreciated. 任何帮助,将不胜感激。

I would like my resulting array to be like this: 我希望结果数组如下所示:

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
                        )    
                )    
        )

So far I have tried array_merge which doesn't put the values in the right place. 到目前为止,我已经尝试了array_merge ,它不会将值放在正确的位置。 I have tried this $data['isInstock'] = $stock[0]['variants'][0]['variantId']; 我已经试过$data['isInstock'] = $stock[0]['variants'][0]['variantId']; which also won't work. 这也行不通。

Sadly, it takes a fair amount of iterating/preparation to get your two arrays ready for use with array_merge_recursive() . 不幸的是,要使两个数组准备好与array_merge_recursive()一起使用,需要大量的迭代/准备工作。 I'll admit, I'm not proud of the convolution in my method. 我承认,我不为我的方法中的卷积感到骄傲。 The major factor in all this is that array_merge_recursive() only "plays nicely" with non-numeric indexes, so I had to replace your numerically indexed keys with relative id values within the arrays. 所有这些的主要因素是array_merge_recursive()仅能与非数字索引“很好地播放”,因此我不得不用数组中的相对id值替换数字索引键。 I'll do my best to explain my steps, but again, it's not pretty... ( Demo ) 我会尽力解释我的步骤,但同样,它也不是很漂亮...( Demo

Step #1: Prepare $stock array: 步骤#1:准备$stock阵列:

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;
}

Step #2: Prepare $data array & merge: 步骤#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
}

Step #3: re-index outer array keys, and display: 步骤#3:重新索引外部数组键,并显示:

$result=array_values($new_data);    
var_export($result);

The bulk of the array preparations is to generate unique id's for the outer and inner arrays (in both $stock & $data ). 数组准备工作的大部分是为外部和内部数组生成唯一的ID(在$stock$data )。 This permits the array_merge to isolate the related productid s and recursively merge the variant elements. 这允许array_merge隔离相关的productid并递归合并variant元素。

If these two arrays are being generated from a database, then my high recommendation is to utilize available database functionality to merge this data instead of php. 如果这两个数组是从数据库生成的,那么我的强烈建议是利用可用的数据库功能来合并此数据,而不是php。

For a simple example of how array_merge_recursive() works here's a small demo . 有关array_merge_recursive()如何工作的简单示例,这是一个小演示 Experiment with the keys in either of the arrays. 尝试使用两个数组中的键。 If you so-much-as remove the # from the numeric string, array_merge_recursive() will assume that it's dealing with numeric indexes and mince things up. 如果要从数字字符串中删除# ,则array_merge_recursive()会假定它正在处理数字索引并将其切碎。 My technique to preserve your id's as strings was to prepend the # , but it could have been done by adding any of a range of non-digit characters to the key value. 我将ID保留为字符串的技术是在#前面加上,但是可以通过将一系列非数字字符添加到键值中来完成。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM