Php 是否创建不等于NULL的函数参数数组?
我将从解释我的最终目标开始,因为可能有更好的解决方案 我有一个名为Php 是否创建不等于NULL的函数参数数组?,php,arrays,arguments,Php,Arrays,Arguments,我将从解释我的最终目标开始,因为可能有更好的解决方案 我有一个名为updateUser的函数,它接受以下参数: function updateUser($password = NULL, $name = NULL, $lastname = NULL, $age = NULL, $email = NULL, $relation = NULL) 如您所见,我已将它们设置为NULL,因此如果它们未通过函数传递,它们将变为空。对吗?(我希望我没弄错) 问题是,每个参数(已传递)都包含要发送到数据库的用
updateUser
的函数,它接受以下参数:
function updateUser($password = NULL, $name = NULL, $lastname = NULL, $age = NULL, $email = NULL, $relation = NULL)
如您所见,我已将它们设置为NULL,因此如果它们未通过函数传递,它们将变为空。对吗?(我希望我没弄错)
问题是,每个参数(已传递)都包含要发送到数据库的用户的信息,我只想在查询中包含传递的变量,因为我不想在数据库中设置未传递到(空白)的变量
所以我想出了一个主意,把所有传递的参数放入一个数组中。然后循环遍历数组中的每个项并生成如下字符串:
$string = "$password, $email";
获取所有非字符串的参数和筛选变量
$arguments = func_get_args();
array_filter($arguments, 'is_string');
//$arguments will be an array with numeric indices
使用函数call_user_func()(),可以根据传递给函数的数据调用数据库插入或更新命令 例如:
function updateUser($password = NULL, $name = NULL, $lastname = NULL,
$age = NULL, $email = NULL, $relation = NULL)
{
$array = array();
// Create an array with indices of passed parameters:
if($password !== NULL) // !== to check for NULL and not empty string.
$array["password"] = $password;
if($name !== NULL)
$array["name"] = $name;
// etc...
call_user_func("addToDb", $array);
}
function addToDb($detailsArray)
{
foreach($detailsArray as $detail)
{
// Add $detail's key with $detail's value to database.
}
}
我认为问题在于您可能无法正确调用该函数。当你这样做的时候:
updateUser('pass', 'user', '', '', 'user@example.com');
updateUser('pass', 'user', null, null, 'user@example.com');
$lastname和$age的值将不会为null,而是一个空字符串。但如果你这样称呼它:
updateUser('pass', 'user', '', '', 'user@example.com');
updateUser('pass', 'user', null, null, 'user@example.com');
它们将保持为空。我想如果您只传递一个包含应更新的属性/值对的数组,它将更加灵活:
function updateUser($props) {
$names = array('password', 'name', 'lastname', 'age', 'email', 'relation');
$arr = array();
for ($names as $name) {
if (isset($props[$names])) {
$arr = "$name = '".mysql_real_escape_string($props[$names]).'"';
}
}
if (!empty($arr)) {
$query = "UPDATE … SET ".implode(',', $arr);
}
}
updateUser(array('name'=>'User A', 'password'=>'secret'))
然后使用具有应更新属性的数组调用此函数:
function updateUser($props) {
$names = array('password', 'name', 'lastname', 'age', 'email', 'relation');
$arr = array();
for ($names as $name) {
if (isset($props[$names])) {
$arr = "$name = '".mysql_real_escape_string($props[$names]).'"';
}
}
if (!empty($arr)) {
$query = "UPDATE … SET ".implode(',', $arr);
}
}
updateUser(array('name'=>'User A', 'password'=>'secret'))
这是对调用用户函数数组()的错误用法。
call_user_func_array()
获取第二个参数(应该是数组)中的每个元素,并将其用作单独的参数,即call_user_func_array('foobar',array('a','b','c')
相当于调用用户函数('foobar','a','b','c')代码>或简单地foobar('a','b','c')代码>(请参阅)经过一番努力,我终于让它工作了。当我第一次看它的时候,我就像是“wtf?那怎么可能呢?”但后来我通读了一遍,它变得更有逻辑了。非常好,谢谢。我找到了一个更好的解决方案,但我会记住这一点。我在PHP档案中搜索了一个类似的函数很久了,哈哈。谢谢你的帖子!