Laravel集合.each()+ array_push

时间:2017-03-13 21:09:14

标签: php laravel-5

在laravel上的.each()方法中需要有关array_push的帮助。我无法在此代码上获取容器数组:

$imagesData = array();
collect($data['images'])->each(function($v, $k) use($imagesData){

    $v['created_at'] = date('Y-m-d H:i:s');
    $v['updated_at'] = date('Y-m-d H:i:s');
    $v['image_id'] = $v['image_id'];
    $v['settings'] = json_encode($v['settings']);

    array_push($imagesData, $v);

});

$result = Images::insert($imagesData, true);

基本上,上面的代码我想迭代.each()中的数据,然后将其推送到数组容器并按批次插入。 注意:当我使用foreach时没有问题,但我需要使用.each()而不是foreach。

由于

2 个答案:

答案 0 :(得分:11)

因为您想要更改原始RLMResults,所以您需要引用此变量而不是仅复制它的值。这是通过使用&符RLMResults *objectsToSaveImagesFor = [self allObjectsToSaveImagesFor]; RLMThreadSafeReference *objectsRef = [RLMThreadSafeReference referenceWithThreadConfined:objectsToSaveImagesFor]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ RLMRealm *realm = [RLMRealm realmWithConfiguration:self.realm.configuration error:nil]; RLMResults *objectsToSaveImagesFor2 = [realm resolveThreadSafeReference:objectsRef]; for (Object *object in objectsToSaveImagesFor2) { BOOL success = [self downloadImageForObject:threadSafeObject]; [realm transactionWithBlock:^{ object.imageSaved = success; }]; } }); 完成的。

$imageData

答案 1 :(得分:6)

使用Collection::map方法是一种更易读的方法来做同样的事情:

$imagesData = collect($data['images'])
    ->map(function($item) {

        $item['created_at'] = date('Y-m-d H:i:s');
        $item['updated_at'] = date('Y-m-d H:i:s');
        $item['image_id'] = $item['image_id'];
        $item['settings'] = json_encode($item['settings']);

        return $item;
    })
    ->all();

$result = Images::insert($imagesData, true);

map以与each相同的方式遍历数组。不同之处在于each不会返回任何内容(因此您需要自己构建新数组),而map会自动在函数内构建return项的新集合。在map之后,您使用all将结果作为普通数组返回。