2017-02-21 24 views
0

Я хочу выбратьbrandname только из $collect, что я могу сделать, чтобы достичь этого?Ливер детского ребенка в Laravel

ток:

$collect = collect([ 
    0 => [ 
     ['name' => 'iPhone 6S', 'brand' => ['name' => 'Apple', 'type' => 'brand', 'id' => 1]], 
    ], 
    1 => [ 
     ['name' => 'Galaxy S7', 'brand' => ['name' => 'Samsung', 'type' => 'brand', 'id' => 2]], 
    ], 
]); 

Ожидаемый результат:

$collect = collect([ 
    0 => [ 
     ['name' => 'iPhone 6S', 'brand' => ['name' => 'Apple']], 
    ], 
    1 => [ 
     ['name' => 'Galaxy S7', 'brand' => ['name' => 'Samsung']], 
    ], 
]); 

EDIT

Я попытался с помощью карты() и каждый (коллекции), предоставленные Laravel, но ни один из них не поможет.

EDIT (РОСС)

Это сработало:

$collect->transform(function ($item) { 
    $itemData = collect($item); 
     return $itemData->transform(function ($item, $key) { 
     if($key == 'brand') { 
      $item = array_only($item, 'name'); 
     } 
     return $item; 
     }); 
    }); 
+0

Вернитесь к нему, да? lol Могу ли я спросить, зачем вам нужно выбирать определенные данные? Dropdowns? –

+0

@MikeBarwick этот вопрос сейчас другой. Это не выпадающие меню, но я стараюсь не раскрывать данные по моему API. – Coder

+0

В этом случае просто 'foreach'. Это безопасный, чистый и читаемый код. –

ответ

1

Вы могли бы сделать что-то вроде:

$collect->transform(function ($item) { 
    return collect($item)->transform(function ($item) { 
     $item['brand'] = array_only($item['brand'], 'name'); 
     return $item; 
    })->toArray(); 
}); 

Надеюсь, это поможет!

+0

Выглядит как хороший код, я получаю эту ошибку: 'array_intersect_key(): Аргумент # 1 не является массивом – Coder

+0

Пробовал отлаживать его, $ item внутри transform имеет значение 1 ничего больше ... – Coder

+0

@PHPLover Какую версию Laravel вы используете? –

1
foreach ($collect as $key => $row) { 
    $collect[$key]['brand'] = ['name' => $collect[$key]['brand']['name']]; 
} 
+0

только что обновил вопрос. – Coder

+0

Что вы подразумеваете под «Выбрать»? – klepzers

+0

Это работает, как и ожидалось, спасибо. Знаете ли вы способ преобразовать это, используя карту из laravel? – Coder

0

Вы можете использовать что-то вроде этого, используя Collection класс, то вы можете использовать map функцию:

// Instantiate the collection 
$collect = collect($collect); 

$transformedArray = $collect->map(function($item) { 
    unset($item[0]['brand']['type']); 
    unset($item[0]['brand']['id']); 
    return $item; 
}) 

OR

Если вы настаиваете, не используя unset,

$collect->map(function($item) { 


    $temp = []; 

    $temp[] = ['name' => $item[0]['name'], 
     'brand' => ['name' => $item[0]['brand']['name']] 
    ]; 
    return $temp; 


}) 

В этом прецеденте, map больше подходит, так как мы в основном только переформатирования структуры

+0

Мне нужно найти способ выбрать, чтобы не удалять, потому что могут появиться новые поля, и мои столбцы будут открыты, что не является будущим. – Coder

+0

Коллекция @PHPLover не изменит исходные данные. Вы можете попробовать и проверить значение '$ collect' должно быть все еще старым – geckob

+0

Обновлено как ваш вопрос – geckob