在每个函数中雄辩地使用foreach

时间:2018-11-29 14:22:12

标签: php laravel eloquent slim

我想交换图像订单(从angularjs / ui-sortable检索到的数据,因此$ newImgOrder数组表示新订单。)

<div class="container">
    <div class="title">Header</div>
    <div class="content">Content</>
</div>

.container {
    display: grid;
    height: 100%;  /* 100vh creates not desired sroll and extra space*/
    grid-template-rows: 34px 1fr;
    grid-template-areas:
        "header"
        "main"
}

.title {
    grid-area: header;
    line-height: 34px;
    vertical-align: middle;
    padding-left: 10px;
    background-color: orange;
}

.content {
    grid-area: main;
    background-color: yellow;
}

*更新=执行此操作的正确方法*

感谢@Devon

已删除foreach + select()

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::select('url')->where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
       foreach ($newImgOrder as $item) {
           $img->url = $item;
           $img->save(); 
       }
   });

以下是我想做什么的快速演示:

操作前的表格状态

(array) $newImgOrder = ['test.jpeg', 'another.jpeg'];

Images::where('project_id', '=', $args['id'])->get()
   ->each(function($img) use (&$newImgOrder) {
           $img->url = array_shift($item);
           $img->save(); 
       }
   });

预期结果=

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | another.jpeg |
+---------+-------------+--------------+
| 2       | 15          | test.jpeg    |
+---------+-------------+--------------+

实际结果=

+---------+-------------+--------------+
| id      | project_id  | url          |  
+---------+-------------+--------------+
| 1       | 15          | test.jpeg    |
+---------+-------------+--------------+
| 2       | 15          | another.jpeg |
+---------+-------------+--------------+

该迭代有什么问题。我尝试使用double foreach,但结果却相同...我错过了什么吗?任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

对于每个图像,您的代码将循环$ newImageOrder并保存该图像的url。因此,您将为每个图像执行两次保存,这显然不是您想要的。

没有理由进行内部foreach循环。如果您确定$ newImageOrder中的元素数将与查询中的行数匹配,并且由于要传递$ newImageOrder作为对闭包的引用,则可以使用shift:

each(function($img) use (&$newImgOrder) {
   $img->url = array_shift($newImgOrder);
   $img->save();
});

这会将第一个元素移出数组并返回它,这意味着您将在每次迭代中删除并使用$ newImgOrder的第一个元素。

请记住,这是一个可变的更改。 $ newImgOrder被闭包修改。如果这不是您想要的,则可能需要使用运行计数作为偏移量。