对多维数组中的相关子数组数据进行分组和合并:合并要在 Wordpress 查询中使用的相关分类法数组设置

问题描述 投票:0回答:1

我正在构建一个带有自定义帖子类型复选框的过滤系统。

我认为 Wordpress 查询期望相同类型的分类法位于同一个数组中。

下面的代码不显示任何“merk”(品牌)。如果我只选择一个品牌,效果很好,选择具有不同分类法的多个盒子也效果很好。 我目前使用 for 循环遍历所有复选框并在选中时添加到数组中。

$array = [ 
    'relation' => 'AND',
    [
        'taxonomy' => 'merk',
        'field' => 'slug', 
        'terms' => ['coral']
    ],
    [
        'taxonomy' => 'merk',
        'field' => 'slug', 
        'terms' => ['deluxe']
    ]
];

当分类法相同时,有没有办法以编程方式合并它们,从而导致以下结果:

[ 
    'relation' => 'AND',
    [
        'taxonomy' => 'merk',
        'field' => 'slug', 
        'terms' => ['coral', 'deluxe']
    ]
];
php arrays wordpress grouping consolidation
1个回答
0
投票

循环时,通过引用修改数组(而不是迭代数组的副本)。如果某个项目具有

taxonomy
field
元素,则它有资格进行合并。第一次遇到时,将
terms
数组声明为引用。如果再次遇到相同的
taxonomy
field
组合,则将
terms
子数组中的一个或多个元素推入引用中。

代码:(演示

$array = [ 
    'relation' => 'AND',
    [
        'taxonomy' => 'merk',
        'field' => 'slug', 
        'terms' => ['coral']
    ],
    [
        'taxonomy' => 'foo',
        'field' => 'bar', 
        'terms' => ['stackoverflow']
    ],
    [
        'taxonomy' => 'merk',
        'field' => 'slug', 
        'terms' => ['deluxe', 'ultra']
    ]
];

foreach ($array as $key => &$item) {
    if (is_array($item) && isset($item['taxonomy'], $item['field'])) {
        $id = $item['taxonomy'] . '_' . $item['field'];
        if (!isset($ref[$id])) {
            $ref[$id] = &$item['terms'];
        } else {
            array_push($ref[$id], ...$item['terms']);
            unset($array[$key]);
        }
    }
}
var_export($array);

输出:

array (
  'relation' => 'AND',
  0 => 
  array (
    'taxonomy' => 'merk',
    'field' => 'slug',
    'terms' => 
    array (
      0 => 'coral',
      1 => 'deluxe',
      2 => 'ultra',
    ),
  ),
  1 => 
  array (
    'taxonomy' => 'foo',
    'field' => 'bar',
    'terms' => 
    array (
      0 => 'stackoverflow',
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.