skip to Main Content

I need to use a variable variable for defining a lambda function inside an array_map(). I get an "Undefined variable" WARNING for the variable I am referencing. Subsequently, I do not get the expected result. The expected and actual results are commented within the code below. A PHP Sandbox of the problem is also given.

$a = "hello";
$$a = "world";

# Prints "world" as expected.
echo $hello;

# GIVES WARNING !!!! (Undefined variable $hello)
$res = array_map(fn($number) => $number . $$a, ["1", "2"]);

# Expected: ["1 world", "2 world"]
# Actual: ["1", "2"]
echo var_dump($res);

PHP Sandbox

Tried:

  1. Replacing $$a with ${$a} did not fix the problem.
  2. Replacing $$a with $hello fixes the problem BUT that solution is not applicable in my particular use case.
  3. I have tried using other functions insted of the concatenation (fn($number) => func($number, $$a)) and the problem remains.

PLSSSSS HEEEEEEEEELP !!!!!

2

Answers


  1. Your issue is due to scoping rules. $$a is not in the local scope of the function, while $world is a regular variable that you’ve defined in the same scope as your array_map function, so it’s recognized and can be used inside the function.

    $a = "hello";
    $$a = "world";
    $world = $$a;
    
    $res = array_map(fn($number) => $number . $world, ["1", "2"]);
    
    var_dump($res);
    
    Login or Signup to reply.
  2. Variables $$ don’t behave the same way as they do in regular PHP code. Here is documentation with explanations and examples; This is why you’re getting Undefined variable warning. You can use a regular anonymous function, which has access to the variable $$, instead of an arrow function

    $a = "hello";
    
    $$a = "world";
    
    $res = array_map(function($number) use ($a) {
        return $number . $$a;
    }, ["1", "2"]);
    
    var_dump($res);
    

    The keyword use brings the variable $a into the scope of the anonymous function so that it can be used inside the function

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search