2

I have this code I don't know why I get error from it.

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

This is so weird cause I have checked var_dump($$repeatType) output, it seems fine:

array(3){["two_years"]=>int(730)["offset_const"]=>int(1)["add_unite"]=>string(4)"days"}
9
  • 1
    @AbhikChakraborty it's fine to have double $$, since it makes variable $monthly, $weekly or $daily to be dynamicaly selected Commented Jul 14, 2014 at 7:28
  • Did you try ($$repeatType)["two_years"]? Commented Jul 14, 2014 at 7:28
  • 1
    ^ I guess he is missing the count Commented Jul 14, 2014 at 7:28
  • @GuyT nope, $foo["two_years"] is a number, no count() missing. Commented Jul 14, 2014 at 7:30
  • @Maerlyn it caused syntax error syntax error, unexpected '[', expecting ';'. Commented Jul 14, 2014 at 7:31

3 Answers 3

6

This is a syntax limitation. PHP is trying to bind the array-index operator to $repeatType (which is a string) and an associative key is invalid in a string, thus causing your problem.

You need to explicitly specify where your variable starts and begins like this:

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

A workaround is to assign it to a temporary variable like this:

$selectedRepeatType = $$repeatType;
for ($i=0; $i < $selectedRepeatType['two_years']; $i++) {}
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks ... never heard about that before.
Note that there is not really a need for a workaround. The curly brackets as you mentioned work just fine.
@peter_the_oak I have tried curly brackets but I got a syntax error after using them.
I tried them too :-) Like this: 1. $name = "two_years"; 2. $two_years = array('A' => 10, 'B' => 20); 3. print_r(${$name}['A']); On my side, these lines work like a charm.
@peter_the_oak oh.. sorry you're right !!, I have tried normal brackets before which is mentioned in the comments above but curly brackets works!!
|
0

I can understand what you want ,but this expression $$repeatType['two_years'] is ambiguous , at least for me it takes me some time to run the code to find out what the output,so first of all I should suggest you don't use such a expression.

OK,come back to the question,you expected $$repeatType['two_years'] to return one of the number 26,52*2,and 365*2.But let us run the code.

$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)

OK ,we know what happend, and you can find why here.

Comments

0

From your code, i can understand that you haven't set a value for $repeatType['two_years']. First assign a value

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

Now "$monthly" is an array so you call:

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

$repeatType['two_years'] need to be defined or it will give a PHP error.

1 Comment

if you check my code again, you can realize that the first line of it checks for $reapeatType value, it's already assigned, the problem was I didn't add the curly brackets, thanks for your suggestion.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.