2014-12-31 5 views
0

Я использую фильтр 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

Я бы сказал, если есть лучший способ сделайте это, мы должны увидеть, что вы пытаетесь сделать с этими переменными позже в коде. Конечно, вам не нужно делать так много переменных. – user3158900

+0

Я не знаю, было бы уместно просить об этом. Это сотни строк кода. Я думал, что смогу получить обратную связь для кусков и обновить соответственно. – rotaercz

+1

В общем, похоже, что вы пытаетесь сделать переменные для каждой возможной комбинации цветов карты MTG - возможно, вы должны генерировать массив, а затем использовать комбинаторную функцию для генерации всех возможных комбинаций, а затем генерировать массивные ключи динамически основанные по этим комбинациям. – Amber

ответ

2

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

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'], который содержит то, что ваши переменные будут иметь.

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

+0

Да, я сделаю это прямо сейчас. :) Я бы хотел посмотреть, есть ли другие предложения. Успокойся, сэр! – rotaercz

+0

После того, как я обновил, так как вы предложили, я получаю сообщение об ошибке: Неопределенная переменная: colors, на этой строке: if ($ card-> colors == $ colors) {return true; } Не знаете почему? – rotaercz

+1

О, потому что '$ colors' определяется во внешней функции, а не внутренней. Я обновил его с помощью правильного 'use' вызова, который должен решить проблему для PHP 5.3+ – Amber

Смежные вопросы