【问题标题】:what is excat functionality of map() in laravel?laravel 中 map() 的 excat 功能是什么?
【发布时间】:2021-07-27 10:01:31
【问题描述】:

我正在从数据库中获取数据,然后向该数据添加一个属性。为此,我在这个函数中使用了map(),我使用了$qty 变量,它具有5 值让我们说。 然后我在下一次迭代中降低它的价值,但不幸的是,这没有发生

    $qty = $request->product_qty;
    $searchProducts->map(function ($product) use ($qty) {
        $qty_taken = $qty - $product->free_qty;
        $product->setAttribute('qty_taken',$qty);
        $qty = $qty - $product->free_qty;
        return $product;
    });

我认为每次map() 提供价值时5 map 不会让逻辑降低其价值。

【问题讨论】:

    标签: laravel eloquent laravel-8 laravel-query-builder


    【解决方案1】:

    map() 方法遍历集合并返回一个新集合,该集合由传递给map() 的闭包返回的项组成。

    由于您不尝试生成新集合,map() 不是您要查找的内容。您只是尝试遍历集合并使用每个项目执行一些操作。为此,您将使用each() 方法。或者,您可以使用简单的 foreach 循环。

    $qty 变量未更新的原因是,就像函数参数一样,use 参数默认按值传递。如果您希望对 $qty 变量的更改在迭代中保持不变,您需要通过引用传递它(在变量前面加上 & 符号)。

    因此,要修复您的代码,有两种选择。

    要继续使用收集方法,请切换到 each() 并通过引用传递(注意与符号):

    $qty = $request->product_qty;
    $searchProducts->each(function ($product) use (&$qty) {
        $qty_taken = $qty - $product->free_qty;
        $product->setAttribute('qty_taken', $qty);
        $qty = $qty - $product->free_qty;
    });
    

    您也可以只使用普通的 PHP foreach,然后您不必担心 $qty 变量的范围,因为它都是本地的。

    $qty = $request->product_qty;
    foreach ($searchProducts as $product) {
        $qty_taken = $qty - $product->free_qty;
        $product->setAttribute('qty_taken', $qty);
        $qty = $qty - $product->free_qty;
    });
    

    【讨论】:

    • 你是对的。性能方面什么更好? each() 或 foreach()
    • @BilalArshad 从理论上讲是 foreach,因此您不会对集合中的每个项目进行函数调用。然而,这是一个微优化,永远不会真正产生影响。你说的是超过 1000 次迭代的微秒。在这种情况下,您会更关心哪些代码对您来说更具可读性/可维护性。我认为 foreach 结构会更容易理解,在所有经验水平。
    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2016-06-07
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多