Php 有什么方法可以简化这一点吗?
我用的是一个Laravel雄辩的收集过滤器。我很确定这是可以简化的,但我不确定是否准确。我在这段代码之后使用了所有的变量,但是我想重构,这样会更好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
$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吗?:)是的,我在业余时间做了一个粉丝网站来娱乐和学习拉威尔。