Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否创建不等于NULL的函数参数数组?_Php_Arrays_Arguments - Fatal编程技术网

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档案中搜索了一个类似的函数很久了,哈哈。谢谢你的帖子!