描述
这个函数在整个WordPress中使用,以允许字符串或数组合并到另一个数组中。
参数
- $args
-
(string|array|object)(必填) 要与$defaults合并的值。
- $defaults
-
(array)(可选) 用作默认值的数组。
默认值: array()
返回
(array) 将用户定义的值与默认值合并。
更多信息
wp_parse_args是一个通用实用程序,用于将参数数组和默认值数组合并在一起。还可以给它一个URL查询类型字符串,该字符串将被转换为数组(即"id=5&status=draft")。
它在整个WordPress中使用,以避免担心默认值和输入的逻辑,并为传递参数生成稳定的模式。像query_posts、wp_list_comments和get_terms这样的函数是wp_parse_args的简化能力的常见示例。
具有基于$args的设置的函数能够无限扩展可能传递给它们的值的数量,避免了因为要跟踪的参数太多而导致超长函数调用的麻烦,其中许多参数的唯一功能是在罕见情况下覆盖通常良好的默认值。
源码
更新日志
版本 | 描述 |
---|---|
2.3.0 | $args 现在也可以是对象。 |
2.2.0 | 开始引入 |
使用示例
基本用法:
function wpdocs_my_function( $args ) { $defaults = array( 'name' => 'Mr. nobody', 'favorite_color' => 'unknown', 'age' => 'unknown', ); $args = wp_parse_args( $args, $defaults ); print_r( $args ); } $args = array( 'age' => 36 ); wpdocs_my_function( $args ); // Output: // // Array( // 'name' => 'Mr. nobody', // 'favorite_color' => 'unknown', // 'age' => 36, // )
感谢bhlarsen提供此函数,但有一个小错误:
if (!$echo)
必须替换为
if (!$args['echo'])
下面是一个使用wp_parse_args系统来管理其单个
$args
参数的示例函数,可以为其提供任何您想要的值。
在本例中$args
存储详细的显示覆盖,这是许多WordPress函数中的一种模式。/** * Define a new function that uses $args and wp_parse_args() */ function wpdocs_explain_parse_args( $args ) { $defaults = array ( 'text' => 'wp_parse_args() merges $args into $defaults', 'before' => "<p>", 'after' => "</p> \n", 'echo' => TRUE ); // Parse incoming $args into an array and merge it with $defaults $args = wp_parse_args( $args, $defaults ); $output = $args['before'] . $args['text'] . $args['after']; if (!$echo) return $output; echo $output; } /** * Run our new function using the defaults (no $args) * This would print out: * <p>wp_parse_args() merges $args into $defaults</p> */ wpdocs_explain_parse_args(); /** * Run the function with some options overridden with an array * This would echo the output with the modified text and before arguments: * <p class='specialclass'>A better explanation</p> */ wpdocs_explain_parse_args( array ( 'text' => "A better explanation", 'before' => "<p class='specialclass'>" ) ); /** * We can also pass in URL-style string-query and it will be converted * This would set $args['echo'] to 1 and $args['text'] to 0 */ wpdocs_explain_parse_args( 'echo=1&text=0' );
如果您希望递归合并两个数组,则函数如下:
if ( ! function_exists( 'awps_recursive_parse_args' ) ) { function awps_recursive_parse_args( $args, $defaults ) { $new_args = (array) $defaults; foreach ( $args as $key => $value ) { if ( is_array( $value ) && isset( $new_args[ $key ] ) ) { $new_args[ $key ] = awps_recursive_parse_args( $value, $new_args[ $key ] ); } else { $new_args[ $key ] = $value; } } return $new_args; } }
测试用例:
$defaults = [ 'x1' => 'level1', 'x2' => [ 'a1' => 'level1', 'a2' => 'level1', ], 'x4' => [ 'b1' => [ 'c1' => 'level1', ], 'b2' => 'level1', ], 'x3' => 'level1', ]; $args = [ 'x3' => 'level2', 'x2' => [ 'a2' => 'level2', ], 'x4' => [ 'b1' => [ 'c1' => 'level2', 'c2' => 'leve2', 'c3' => [ 'd1' => [ 'e1' => 'ok', ], ], ], ], ]; print_r( awps_recursive_parse_args( $args, $defaults ); /** * Result */ /* [ 'x1' => 'level1', 'x2' => [ 'a1' => 'level1', 'a2' => 'level2', ], 'x4' => [ 'b1' => [ 'c1' => 'level2', 'c2' => 'leve2', 'c3' => [ 'd1' => [ 'e1' => 'ok', ], ], ], 'b2' => 'level1', ], 'x3' => 'level2', ]; */