【发布时间】:2020-05-30 21:47:33
【问题描述】:
我将尝试解释我的问题。我正在尝试在 PHP 中创建一个国际象棋引擎(只是为了好玩:-))代码中的整数只返回有效的移动(为了简单起见 - 在实际代码中,它的对象和移动模式取决于它是关于哪一块)
我正在寻找一种有效搜索数组的方法。有效是指尽可能快。看看我在下面代码中的评论“是否可以在不遍历所有 1000 个值的情况下跳出循环?”我希望 cmets 会尝试解释我想要实现的目标。我只是在寻找优化以下代码的想法,而不是完整的代码:-)
//This is for demonstrating
//1000 values to go through
$moves_maybe_valid = range(1,1000);
shuffle($moves_maybe_valid);
//Go through possible values
$move_checked = [];
$nr=0;
foreach($moves_maybe_valid as $mmv) {
$move_is_valid = check_move($mmv);
//Check if not in checked array
if ($move_is_valid === false && !in_array($mmv, $move_checked)) {
//Add to checked move array
$move_checked[] = $mmv;
}
//IS it possible to break out of loop without
//going through all 1000 values?
//When all valid moves are true I want to break here
//but I don't know when that is.
}
//for demonstration purpose only
//numbers (5,6) that returns true are unknown until an
//an actual check is done in this function
function check_move($nr) {
if ($nr == 5 || $nr == 6) {
return true;
}
return false;
}
如果我说我会从一开始就生成有效的移动(基于下面的 cmets)
$valid_moves = [5,6];
摆脱循环的最佳方法是什么?
【问题讨论】:
-
foreach(range(1,1000) as $nr) $moves_maybe_valid[] = $nr;只是$moves_maybe_valid = range(1, 1000);哈哈:P -
@RoboRobok .- 哈哈。真的!很抱歉 :-) LOL
-
你的意思是,
break;? -
我无法想象如果你没有检查移动是否有效,你怎么会知道没有更多的有效移动。你为什么不首先生成有效的移动?
-
一个优化是你可能不需要检查
in_array。除非您的原始列表中有重复项,否则您不可能多次添加相同的动作。 in_array 很昂贵,从 O(n) 到 O(n^2)
标签: php performance random