我有这样的功能:
for($j; $j < $l; $j++) {
if ($type != 'a'){
$coords = array('x'=>$points[$j]['x'],'y'=>$points[$j]['y']);
} else {
$coords = array('x'=>$points[$j]['loc']['x'],'y'=>$points[$j]['loc']['y']);
}
//other wird math operations for ex.
$x = 100 + $coords['x'];
$y = 200 + $coords['y'];
}
这个条件是循环,迭代超过1 mio。每次这样的表现非常重要,并且积分集中的所有记录都是这种类型或这种类型,它们之间不能混合。
所以我想以某种方式删除这个条件并在循环开始之前移动它。我的想法是使用变量作为数组键。
例如(伪代码):
if ($type != 'a'){
$keyX = 'x';
$keyY = 'y';
} else {
$keyX = ['loc']['x'];
$keyY = ['loc']['y'];
}
for($j; $j < $l; $j++) {
$x = 100 + $points[$j]$keyX;
$y = 100 + $points[$j]$keyY;
}
我知道上面的代码不起作用,但我想展示我的一般概念。是否有可能在PHP中全部?或许还有其他解决方案。
修改
这里最大的问题是,一个数组是多维的
答案 0 :(得分:3)
为什么不把if语句放在for循环周围,然后决定你要通过哪个循环,例如。
if($type != "a") {
for($j; $j < $l; $j++)
$x = 100 + $points[$j]['y'];
} else {
for($j; $j < $l; $j++)
$x = 100 + $points[$j]['loc']['y'];
}
无需将其分配给变量,然后只访问一个数组元素。
答案 1 :(得分:1)
工作但不切实际的方法::)
$l = 1;
$points[0]['x'] = '0x';
$points[1]['x'] = '1x';
$points[1]['loc']['x'] = '1-loc-x';
$points[0]['loc']['x'] = '0-loc-x';
$type = 'a';
$x = '';
if ($type != 'a') {
$key = "['x']";
}else{
$key = "['loc']['x']";
}
for($j=0;$j<$l;$j++){
$x .= eval('echo $points['.$j.']'.$key.';');
echo $x;
}
结果0-loc-x
EDIT1 如果你真的遇到过这种情况的任务,你应该考虑按键$ points [loc] [x]的逆序创建数组。那么你的代码就很简单了:
$keyX = $type != 'a ? &$points['x'] : &$points['loc']['x'];
for($j; $j < $l; $j++) {
$x = 100 + $keyX[$j];
}