[英]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.