Php 有什么方法可以简化这一点吗?

Php 有什么方法可以简化这一点吗?,php,laravel,collections,eloquent,Php,Laravel,Collections,Eloquent,我用的是一个Laravel雄辩的收集过滤器。我很确定这是可以简化的,但我不确定是否准确。我在这段代码之后使用了所有的变量,但是我想重构,这样会更好 $cards = new Collection($data); $whiteBlueBlackRedGreen = $cards->filter(function($card) { if ($card->colors == '["White","Blue","Black","Red","Green"]') { retur

我用的是一个Laravel雄辩的收集过滤器。我很确定这是可以简化的,但我不确定是否准确。我在这段代码之后使用了所有的变量,但是我想重构,这样会更好

    $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; }});

那么,您可以稍微考虑一下过滤:

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的版本,以确保它是正确的组合集-您可以在这里看到测试:

是的,我现在就做。:)不过,我想看看是否还有其他建议。先生,给你一杯!在按照您的建议进行更新之后,我得到了一个错误:未定义变量:colors,在这一行:if($card->colors==$colors){return true;}不知道为什么?哦,因为
$colors
是在外部函数中定义的,而不是在内部函数中定义的。我已经用适当的
use
调用对其进行了更新,这应该可以解决PHP5.3+的问题,哦,伙计,第二部分真的很有用。我希望得到一些类似的见解。我想说,如果有更好的方法来实现这一点,我们需要看看您稍后在代码中尝试如何处理这些变量。当然,你不应该做这么多的变量。我不知道这样问是否合适。这是数百行代码。我在想我可以得到块的反馈并相应地更新。所以一般来说,感觉就像你试图为每种可能的MTG卡颜色组合创建变量-也许你应该生成一个数组,然后使用组合函数生成所有可能的组合,然后根据这些组合动态生成数组键。@rotaercz我在我的答案中添加了一个扩展部分,它完成了我提到的组合学部分。它显著缩短了代码,并将其更改为使用数组而不是大量变量。@Amber:播放MTG吗?:)是的,我在业余时间做了一个粉丝网站来娱乐和学习拉威尔。