[英]How to pass multiple function parameters in an array in php?
我想将多个参数传递给数组中的 function。 参数本身是 arrays 个字符串。
我有一个名为new_action()
的 function,我通过以下方式调用它:
new_action(array('actions' => array('ACTION1','ACTION2'), 'tables' => array('table1','table2')));
function 看起来像这样:
public function new_action($params=array()) {
$tables = array();
$actions = array();
if(count($params)) {
foreach($params as $k => $v) {
$tables = ($k == 'tables') ? $v : array();
$actions = ($k == 'actions') ? $v : array();
}
// Do useful stuff with the variables here ...
var_dump($tables);
var_dump($actions);
// ======== ACTUAL OUTPUT: ========
// array(0) { }
// array(0) { }
// ======== EXPECTED OUTPUT: ========
// array(2) { [0]=> string(6) "table1" [1]=> string(6) "table2" }
// array(2) { [0]=> string(7) "ACTION1" [1]=> string(7) "ACTION2" }
}
}
如您所见,循环内$v
的值(字符串数组)永远不会被复制到循环外的变量$tables
或$actions
。
我认为这很可能是 scope 问题,但查看与此类似的其他问题的答案并没有为我阐明解决方案。
我如何重构代码,以便我可以访问存储在$v
中的那些foreach
for each 循环外的每个$k
?
您的代码正在覆盖之前设置的内容,因为当键与tables
或actions
不匹配时,您将值设置为array()
。 所以当$k == 'tables'
时, $actions
被设置回一个空数组。
如果你想保持循环,而不是三元运算符,基本上是if/else
,重构为if
:
foreach($params as $k => $v) {
if ($k == 'tables') {
$tables = $v;
}
if ($k == 'actions') {
$actions = $v;
}
}
或者它可以通过在开始时显式检查这些键而不是循环来压缩一点:
function new_action($params=array()) {
$tables = isset($params['tables']) ? $params['tables'] : array();
$actions = isset($params['actions']) ? $params['actions'] : array();
// Do useful stuff with the variables here ...
var_dump($tables);
var_dump($actions);
}
您实际上不需要 foreach 来获取 output:
public function new_action($params = array()) {
$tables = array_key_exists('tables', $params) ? $params['tables'] : [];
$actions = array_key_exists('actions', $params) ? $params['actions'] : [];
// Do useful stuff with the variables here ...
var_dump($tables); // Outputs => array(2) { [0]=> string(6) "table1" [1]=> string(6) "table2" }
var_dump($actions); // Outputs => array(2) { [0]=> string(7) "ACTION1" [1]=> string(7) "ACTION2" }
}
}
这些值是空的,因为使用 foreach 会覆盖现有值。
您甚至可以将其编写得更简单,并使用带括号的数组速记语法来提高可读性。
null 合并运算符是避免编写isset()
的语法糖,也是三元运算符。 如果已设置,它将返回其内容,否则设置为空数组。
new_action(['actions' => ['ACTION1', 'ACTION2'], 'tables' => ['table1', 'table2']]);
function new_action($p = array()): void {
$tables = $p['tables'] ?? [];
$actions = $p['actions'] ?? [];
var_dump($tables);
var_dump($actions);
}
array(2) { [0] => string(6) "table1" [1] => string(6) "table2" }
数组(2){ [0] => 字符串(7)“ACTION1”[1] => 字符串(7)“ACTION2”}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.