使用变量作为数组键

时间:2015-05-21 18:06:09

标签: php arrays

我有这样的功能:

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中全部?或许还有其他解决方案。

修改

这里最大的问题是,一个数组是多维的

2 个答案:

答案 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];
}