如何在php lambda函数中使用引用变量

如何在php lambda函数中使用引用变量,php,lambda,reference,Php,Lambda,Reference,我在这个方法$condition变量集合中定义了上面的方法,通过引用和查询取消设置了一些值,但是当我在最后一行使用$condition时,这个更改(取消设置())没有保存! 如何保存已更改的$condition?您的错误是,在签名中使用数组$condition而不是数组和$condition,因此lamba中的所有引用都是对初始副本的引用。下面是一个小例子: public function getAllByField(array &$condition) { return $th

我在这个方法
$condition
变量集合中定义了上面的方法,通过引用和查询取消设置了一些值,但是当我在最后一行使用
$condition
时,这个更改(
取消设置()
)没有保存!
如何保存已更改的
$condition

您的错误是,在签名中使用
数组$condition
而不是
数组和$condition
,因此lamba中的所有引用都是对初始副本的引用。下面是一个小例子:

public function getAllByField(array &$condition)
{
    return $this->repository->scopeQuery(
        function ($query) use (&$condition) {
            return $query->where('status', '!=', '9')->whereRaw(
                array_reduce(
                    array_keys($condition), function ($carry, $k) use (&$condition) {
                        if(in_array('json', $item = $condition[$k])) {
                            $jsonColumns = explode('->', $item[0]);
                            unset($condition[$k]);

                            return  'JSON_VALUE('.$jsonColumns[0].',\'$.'.$jsonColumns[1].'\') '
                                    .$item[1].' '
                                    .(is_string($item[2])? '\''.$item[2].'\'':$item[2]);
                        }
                    }
                )
            );
        }
    )->findWhere($condition)->all();
}
如果删除removeTest签名中的首字母&lambda通过引用使用变量并不重要,因为第一次调用将创建一个副本,并且原始
$arr
保持不变

如果要使用对象,则始终是通过引用:

function removeTest(array &$condition)
{
    (function () use (&$condition) {
        if (isset($condition["test"])) {
            unset($condition["test"]);
        }
    })();
}

$arr = ["test" => "test", "test2" => "test2"];
removeTest($arr);
print_r($arr); // prints ["test2" => "test2"]

您的错误是在签名中使用了
array$condition
而不是
array&$condition
,因此lambas中的所有引用都是对初始副本的引用。下面是一个小例子:

public function getAllByField(array &$condition)
{
    return $this->repository->scopeQuery(
        function ($query) use (&$condition) {
            return $query->where('status', '!=', '9')->whereRaw(
                array_reduce(
                    array_keys($condition), function ($carry, $k) use (&$condition) {
                        if(in_array('json', $item = $condition[$k])) {
                            $jsonColumns = explode('->', $item[0]);
                            unset($condition[$k]);

                            return  'JSON_VALUE('.$jsonColumns[0].',\'$.'.$jsonColumns[1].'\') '
                                    .$item[1].' '
                                    .(is_string($item[2])? '\''.$item[2].'\'':$item[2]);
                        }
                    }
                )
            );
        }
    )->findWhere($condition)->all();
}
如果删除removeTest签名中的首字母&lambda通过引用使用变量并不重要,因为第一次调用将创建一个副本,并且原始
$arr
保持不变

如果要使用对象,则始终是通过引用:

function removeTest(array &$condition)
{
    (function () use (&$condition) {
        if (isset($condition["test"])) {
            unset($condition["test"]);
        }
    })();
}

$arr = ["test" => "test", "test2" => "test2"];
removeTest($arr);
print_r($arr); // prints ["test2" => "test2"]

您是否尝试通过引用getAllByField函数来传递$condition变量?@DmitryButeiko是,但不起作用!试着在你的生活中的每一个地方通过引用传递code@DmitriyButeiko你能再解释一下吗?如何通过引用传递?您是否尝试通过引用将$condition变量传递给getAllByField函数?@DmitriyButeiko是,但不起作用!试着在你的生活中的每一个地方通过引用传递code@DmitriyButeiko你能再解释一下吗?我如何通过引用传递?@navidrajaie那么你的问题不再是你帖子中的代码,而是调用
getAllByField
。请记住,制作副本所需的一切都是
$arr2=$arr1
@navidrajaie那么您的问题就不再是您帖子中的代码了,而可能是
getAllByField
的调用者。请记住,制作副本所需的时间是
$arr2=$arr1