我需要在woocommerce中对我的产品属性的数据结构进行排序,对每个属性及其值进行分组。
我的阵列现在
array (size=5)
0 =>
array (size=1)
'pa_color' =>
array (size=1)
0 => string 'red' (length=3)
1 =>
array (size=1)
'pa_color' =>
array (size=1)
0 => string 'red' (length=3)
2 =>
array (size=2)
'pa_color' =>
array (size=1)
0 => string 'gray' (length=4)
'pa_modello' =>
array (size=1)
0 => string 'modello2' (length=8)
3 =>
array (size=1)
'pa_color' =>
array (size=1)
0 => string 'yellow' (length=6)
4 =>
array (size=0)
empty
字符串
我需要合并如下内容:
array (size=1)
'pa_color' =>
array (size=1)
0 => string 'red' (length=3)
1 => string 'gray' (length=4)
2 => string 'yellow' (length=6)
'pa_modello' =>
array (size=1)
0 => string 'modello2' (length=8)
型
将相同键的值分组到一个数组中。
thanks in advance
4条答案
按热度按时间332nm8kg1#
字符串
l2osamch2#
假设
$array
是你的数组:字符串
这个应该可以了
编辑:
对于动态属性注解:
型
它看起来很复杂..我找不到更好的方法。
5ktev3wc3#
循环遍历第一级条目,然后添加一个嵌套循环,从子数组中的所需键和值创建变量。
因为最深的子数组中只有一个元素,所以可以在嵌套循环中使用“数组解构”将唯一的元素值赋为
$value
。通过将
$value
声明为结果数组中深度值的键,确保输出中的值是唯一的。如果您确实希望重新索引子数组,可以使用
array_map()
和array_values()
来实现这一点--但仅在必要时才这样做。产品编号:(Demo)
字符串
输出量:
型
p.s.如果你的深层子数组可能有多个元素,那么只需要用另一个循环来适应这个级别。
型
翻译成你在自我回答帖子中写的代码,我认为它可能看起来像这样:
型
mwecs4sa4#
合并最简单的方法是在数组的数组上使用
array_merge_recursive
和splat操作符(...
)。splat操作符将解包数组,可用于递归合并它们。
字符串
另外,如果您只需要合并数组中的唯一值,则可以像这样使用
array_map
型
more about splat operator的
* 评论后编辑 *
因为我自己一直在大量使用这种方法,所以我做了一些测试,看看哪一种更快。
分享成果:
问:这两种方法哪个更快?
方法一:
array_map('array_unique', array_merge_recursive(...$array));
方法2:使用
foreach
,如mickmackusa的回答中所述使用大小为5、50、100和500的阵列进行测试
每个函数循环10000和100000。
T1是
array_merge_recursive
所花费的时间,T2是foreach
所花费的时间| 数组大小|循环计数|T1| T2|快|diff|
| --|--|--|--|--|--|
| 5 |一万|0.041| 0.0206| foreach| 0.0204|
| 5 |十万|0.2061| 0.2082|数组归并递归|零点零二|
| 5 |五十万|一点零三一五|1.0611|数组归并递归|0.0296|
| 50 |一万|零点四六|一千八百七十八|数组归并递归|0.1418|
| 50 |十万|0.4452|一点八八七七|数组归并递归|一点四四二五|
| 100 |一万|零六九七|0.3729|数组归并递归|0.3032|
| 100 |十万|0.6795|三四六四|数组归并递归|三点零六六九|
| 500 |一万|0.2542| 1.8674|数组归并递归|一点六一三二|
| 500 |十万|二点五三五九|18.6922|数组归并递归|十六点一五六二|
结论:
1.对于小型数组,使用什么并不重要,我只在500,000次循环后才注意到差异
1.不同的是当你使用更大的数组时。当使用计数为500
foreach
的数组时,需要多花16.1562秒。因此,如果你有较小的数组,你可以使用任何你想要的。对于较大的数组,一定要避免
foreach
,而使用array_merge_recursive
链接到test sandbox