Есть ли способ, которым я могу упростить это?

Я использую фильтр Laravel Eloquent Collection. Я почти уверен, что это можно упростить, но точно не уверен. Я использую все переменные после этого куска кода, но я бы хотел провести рефакторинг, чтобы он был лучше.

    $cards = new Collection($data);

$whiteBlueBlackRedGreen = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Black","Red","Green"]') { return true; }});

$whiteBlueBlackRed = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Black","Red"]') { return true; }});
$whiteBlueBlackGreen = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Black","Green"]') { return true; }});
$whiteBlueRedGreen = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Red","Green"]') { return true; }});
$whiteBlackRedGreen = $cards->filter(function($card) { if ($card->colors == '["White","Black","Red","Green"]') { return true; }});
$blueBlackRedGreen = $cards->filter(function($card) { if ($card->colors == '["Blue","Black","Red","Green"]') { return true; }});

$whiteBlueBlack = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Black"]') { return true; }});
$whiteBlueRed = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Red"]') { return true; }});
$whiteBlueGreen = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Green"]') { return true; }});
$whiteBlackRed = $cards->filter(function($card) { if ($card->colors == '["White","Black","Red"]') { return true; }});
$whiteBlackGreen = $cards->filter(function($card) { if ($card->colors == '["White","Black","Green"]') { return true; }});
$whiteRedGreen = $cards->filter(function($card) { if ($card->colors == '["White","Red","Green"]') { return true; }});
$blueBlackRed = $cards->filter(function($card) { if ($card->colors == '["Blue","Black","Red"]') { return true; }});
$blueBlackGreen = $cards->filter(function($card) { if ($card->colors == '["Blue","Black","Green"]') { return true; }});
$blueRedGreen = $cards->filter(function($card) { if ($card->colors == '["Blue","Red","Green"]') { return true; }});
$blackRedGreen = $cards->filter(function($card) { if ($card->colors == '["Black","Red","Green"]') { return true; }});

$whiteBlue = $cards->filter(function($card) { if ($card->colors == '["White","Blue"]') { return true; }});
$whiteBlack = $cards->filter(function($card) { if ($card->colors == '["White","Black"]') { return true; }});
$whiteRed = $cards->filter(function($card) { if ($card->colors == '["White","Red"]') { return true; }});
$whiteGreen = $cards->filter(function($card) { if ($card->colors == '["White","Green"]') { return true; }});
$blueBlack = $cards->filter(function($card) { if ($card->colors == '["Blue","Black"]') { return true; }});
$blueRed = $cards->filter(function($card) { if ($card->colors == '["Blue","Red"]') { return true; }});
$blueGreen = $cards->filter(function($card) { if ($card->colors == '["Blue","Green"]') { return true; }});
$blackRed = $cards->filter(function($card) { if ($card->colors == '["Black","Red"]') { return true; }});
$blackGreen = $cards->filter(function($card) { if ($card->colors == '["Black","Green"]') { return true; }});
$redGreen = $cards->filter(function($card) { if ($card->colors == '["Red","Green"]') { return true; }});

$white = $cards->filter(function($card) { if ($card->colors == '["White"]') { return true; }});
$blue = $cards->filter(function($card) { if ($card->colors == '["Blue"]') { return true; }});
$black = $cards->filter(function($card) { if ($card->colors == '["Black"]') { return true; }});
$red = $cards->filter(function($card) { if ($card->colors == '["Red"]') { return true; }});
$green = $cards->filter(function($card) { if ($card->colors == '["Green"]') { return true; }});

0

Решение

Ну, вы можете немного отфильтровать фильтрацию:

function getCards($cards, $colors) {
return $cards->filter(function($card) use ($colors) {
if ($card->colors == $colors) { return true; }
});
}

$whiteBlueBlackRedGreen = getCards($cards, '["White","Blue","Black","Red","Green"]');
// and so on...

Это позволило бы избежать многократной типизации и облегчить чтение кода.


Идя глубже в кроличью нору …

$cards = new Collection($data);

function getCards($cards, $colors) {
return $cards->filter(function($card) use ($colors) {
if ($card->colors == $colors) { return true; }
});
}

$colors = array("White", "Blue", "Black", "Red", "Green");
$coloredCards = array();
foreach($colors as $color) {
foreach($coloredCards as $existingCombo => $existingCards) {
$newKey = $existingCombo . "-" . $color;
$coloredCards[$newKey] = getCards($cards, json_encode(explode("-", $newKey)));
}
$coloredCards[$color] = getCards($cards, '["' . $color . '"]');
}

Я на самом деле не проверял это, но он должен получить массив с ключами, как $coloredCards['White-Blue-Black'] он содержит то, что будут иметь ваши переменные.

Изменить: я протестировал версию, которая на самом деле не вызывает getCards, чтобы убедиться, что это правильный набор комбинаций — вы можете увидеть тест здесь: http://ideone.com/Uk6H5x

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector