【问题标题】:How to add merge subarrays of two multi-dimensional arrays如何添加两个多维数组的合并子数组
【发布时间】:2017-10-18 20:34:11
【问题描述】:

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

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

如果它们都匹配,则根据variantId 值将它们放入每个size 下的数组中。

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

我一直在尝试解决这个问题,但我一直卡住。我可以分配单个值,但不能让它完成整个数组。任何帮助,将不胜感激。

我希望我的结果数组是这样的:

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']; 也行不通。

【问题讨论】:

  • 您到底在尝试什么?除了显示您期望的输出之外,还显示您迄今为止尝试过的内容 - 以及您遇到的问题。
  • 您应该养成accepting answers 的习惯,它为您提供最佳解决方案。这个网站是双向的,如果你不回馈帮助你的人,你将来不会得到太多帮助。
  • 在您指出之前不知道接受答案。我希望随着我变得更好,我将来也可以帮助其他人。到目前为止,我已经尝试过 array_merge、array_combine 和 array_push。
  • @adamp $stock 和 $data 总是有相同的长度吗?或者其中一个数组可能会有更多的子数组?如果其中一个总是等于或大于另一个,则此信息在此过程中很重要。另外,$stock 是否真的需要productid 和productId?这似乎是一个可以省略的简单冗余。

标签: php arrays multidimensional-array array-merge sub-array


【解决方案1】:

遗憾的是,需要大量的迭代/准备才能让您的两个数组准备好与array_merge_recursive() 一起使用。我承认,我并不为我的方法中的卷积感到自豪。这一切的主要因素是array_merge_recursive() 仅与非数字索引“配合得很好”,因此我不得不用数组中的相对 id 值替换您的数字索引键。我会尽力解释我的步骤,但同样,它并不漂亮......(Demo)

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

第 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。这允许 array_merge 隔离相关的 productids 并递归合并 variant 元素。

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

关于array_merge_recursive() 工作原理的简单示例,这里有一个小的demo。试验任一数组中的键。如果您从数字字符串中删除#,那么array_merge_recursive() 将假定它正在处理数字索引并将其切碎。我将您的 id 保留为字符串的技术是在 # 前面添加,但可以通过将任意范围的非数字字符添加到键值来完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2020-04-21
    • 2021-02-02
    • 2012-01-23
    • 2020-04-06
    相关资源
    最近更新 更多