如何从同名表单字段生成类似$meta_query的多维数组?
解决meta_query数组格式不匹配问题
你需要生成嵌套结构的meta_query数组(包含relation和子条件数组),但实际得到的是扁平化的、带数字后缀的字段数组。下面给你两种可行的解决方案:
方案1:调整表单字段命名(推荐)
如果可以修改前端表单的字段命名,直接把字段设置为数组格式,这样后端无需额外处理就能得到目标结构。
示例表单代码:
<!-- 关系选择 --> <select name="meta_query[relation]"> <option value="OR" selected>OR</option> </select> <!-- 第一个条件组 --> <input type="text" name="meta_query[0][key]" value="Demo"> <input type="text" name="meta_query[0][value]" value="demo"> <select name="meta_query[0][compare]"> <option value="=" selected>=</option> </select> <select name="meta_query[0][type]"> <option value="NUMERIC" selected>NUMERIC</option> </select> <!-- 第二个条件组 --> <input type="text" name="meta_query[1][key]" value="test"> <input type="text" name="meta_query[1][value]" value="tes"> <select name="meta_query[1][compare]"> <option value="=" selected>=</option> </select> <select name="meta_query[1][type]"> <option value="NUMERIC" selected>NUMERIC</option> </select>
提交表单后,后端直接通过$_POST['meta_query']就能获取到你想要的数组结构:
$meta_query = $_POST['meta_query'];
方案2:后端重组现有扁平化数组
如果无法修改表单,只能处理现有的key1/value1格式数组,可以通过PHP代码把它转换成目标结构:
// 假设这是你获取到的原始响应数组 $raw_response = array( 'relation' => 'AND', 'key1' => 'Demo', 'value1' => 'demo', 'compare1' => '=', 'type1' => 'NUMERIC', 'key2' => 'test', 'value2' => 'test', 'compare2' => '=', 'type2' => 'NUMERIC' ); // 初始化目标meta_query数组 $meta_query = [ 'relation' => $raw_response['relation'] // 保留关系设置 ]; // 遍历原始数组,重组条件组 $condition_groups = []; foreach ($raw_response as $raw_key => $value) { // 匹配带数字后缀的字段(比如key1、value2) if (preg_match('/^([a-z]+)(\d+)$/', $raw_key, $matches)) { $field_name = $matches[1]; // 提取字段名:key/value/compare/type $group_index = (int)$matches[2] - 1; // 转成从0开始的索引 // 初始化对应索引的条件组 if (!isset($condition_groups[$group_index])) { $condition_groups[$group_index] = []; } $condition_groups[$group_index][$field_name] = $value; } } // 把重组后的条件组合并到meta_query $meta_query = array_merge($meta_query, $condition_groups); // 输出结果 print_r($meta_query);
运行结果
执行上述代码后,你会得到符合需求的数组:
Array ( [relation] => AND [0] => Array ( [key] => Demo [value] => demo [compare] => = [type] => NUMERIC ) [1] => Array ( [key] => test [value] => test [compare] => = [type] => NUMERIC ) )
如果需要把relation改成OR,直接修改$raw_response['relation']的值即可。
内容的提问来源于stack exchange,提问作者user9312196
相关产品推荐
相关产品推荐

