由于此功能可以使用未知数量的参数:
function BulkParam(){
return func_get_args();
}
print_r
只打印值,但我如何检索变量名和数组键?例如:
$d1 = "test data";
$d2 = "test data";
$d3 = "test data";
print_r(BulkParam($d1, $d2, $d3));
它会打印出来:
Array
(
[0] => test data
[1] => test data
[2] => test data
)
但是我希望将变量名称作为所有数组的索引名称或键名。然后数组看起来像这样:
Array
(
[d1] => test data
[d2] => test data
[d3] => test data
)
答案 0 :(得分:1)
你做不到。变量名称不会传递给函数。变量是特定算法本地的占位符,它们不是数据,它们在另一个范围内没有意义,并且不会被传递。如果需要键值对,则传递显式命名的关联数组:
bulkParam(['d1' => $d1, 'd2' => $d2, ...]);
这是shortcut:
bulkParam(compact('d1', 'd2'));
然后使用数组:
function bulkParam(array $params) {
foreach ($params as $key => $value) ...
}
正如Mark在评论中提到的那样,有时你甚至没有变量:
bulkParam('foo');
bulkParam(foo(bar(baz())));
现在是什么?
或者最终你想要重构代码并更改变量名称:
// old
$d1 = 'd1';
bulkParam($d1);
// new
$userName = 'd1';
bulkParam($userName);
您的应用程序行为不应仅仅因为重命名变量而改变。
答案 1 :(得分:1)
我确定PHP精英会遇到很多这个问题的问题,但它确实有效(我使用的是PHP 5.6)老实说我不在乎,因为我已经完成了在我的许多Java项目中,为了进行原型设计而进行的攻击远不如此。
function args_with_keys( array $args, $class = null, $method = null, $includeOptional = false )
{
if ( is_null( $class ) || is_null( $method ) )
{
$trace = debug_backtrace()[1];
$class = $trace['class'];
$method = $trace['function'];
}
$reflection = new \ReflectionMethod( $class, $method );
if ( count( $args ) < $reflection->getNumberOfRequiredParameters() )
throw new \RuntimeException( "Something went wrong! We had less than the required number of parameters." );
foreach ( $reflection->getParameters() as $param )
{
if ( isset( $args[$param->getPosition()] ) )
{
$args[$param->getName()] = $args[$param->getPosition()];
unset( $args[$param->getPosition()] );
}
else if ( $includeOptional && $param->isOptional() )
{
$args[$param->getName()] = $param->getDefaultValue();
}
}
return $args;
}
使用PHP Reflections API,我们获取所有方法参数并将它们与数字索引对齐。 (可能有更好的方法。)
只需输入:
即可print_r( args_with_keys( func_get_args() ) );
我还添加了可选地返回方法的可选参数和值的功能。我确信这个解决方案远非完美,因此您的里程可能会有所不同。请记住,虽然我确实提供了类,因此提供类和方法是可选的,但我强烈建议您指定它们,如果您在生产环境附近的任何地方。除了原型设置之外,你应该尽量避免使用它。
使用以下命令指定类和方法:
print_r( args_with_keys( func_get_args(), __CLASS__, __FUNCTION__ ) );