PHP非法字符串偏移错误

时间:2014-07-14 07:24:53

标签: php

我有这段代码,我不知道为什么会收到错误。

if( ! in_array($repeatType, ['monthly', 'weekly', 'daily'])){
    // do somehting
}
$monthly = ['two_years' => 26, 'offset_const' => 4, 'add_unite' => 'weeks'];
$weekly = ['two_years' => 52*2, 'offset_const' => 1, 'add_unite' => 'weeks'];
$daily = array('two_years' => 365*2, 'offset_const' => 1, 'add_unite' => 'days');

for ($i=0; $i < $$repeatType['two_years']; $i++) { #<--- here I get the error

    // ..... // rest of the code

这是如此奇怪,因为我检查了var_dump($$repeatType)输出,看起来很好:

array(3){["two_years"]=>int(730)["offset_const"]=>int(1)["add_unite"]=>string(4)"days"}

3 个答案:

答案 0 :(得分:6)

这是语法限制。 PHP正在尝试将数组索引运算符绑定到$ repeatType(这是一个字符串),并且关联键在字符串中无效,从而导致您的问题。

您需要明确指定变量的开始和开始位置,如下所示:

for ($i=0; $i < ${$repeatType}['two_years']; $i++) {}

解决方法是将其分配给这样的临时变量:

$selectedRepeatType = $$repeatType;
for ($i=0; $i < $selectedRepeatType['two_years']; $i++) {}

答案 1 :(得分:0)

我可以理解你想要什么,但是这个表达式$$ repeatType [&#39; two_years&#39;]是不明确的,至少对我来说,运行代码需要一些时间来找出输出是什么,所以首先,我建议你不要使用这样的表达方式。

好的,回到问题,你期望$$repeatType['two_years']返回26,52 * 2和365 * 2中的一个。但是让我们运行代码。

$name='a';
$a=array('n'=>1);
$a=array('n'=>2);
$a=array('n'=>3);

var_dump($$name['n']);  //array(1) { ["n"]=> int(3) }
var_dump($$name);       //array(1) { ["n"]=> int(3) }
var_dump(${$name}['n']);//int(3)

好的,我们知道发生了什么,你可以找到原因here

答案 2 :(得分:0)

从您的代码中,我可以理解您没有为$ repeatType ['two_years']设置值。首先分配一个值

$repeatType['two_years'] = "monthly";

现在“$ monthly”是一个数组,所以你打电话:

for ($i=0; $i < ${$repeatType['two_years']}['two_years']; $i ++){
    //Loop 26 times.
}

$ repeatType ['two_years']需要定义,否则会产生PHP错误。