Formatting an array value inside a Heredoc

Kamil Sindi picture Kamil Sindi · Nov 26, 2011 · Viewed 12.2k times · Source

I was wondering why I can't do something like {number_format($row['my_number'])} inside a Heredoc. Is there any way around this without having to resort to defining a variable like $myNumber below?

Looked at http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc but found nothing.

CODE

foreach ($dbh -> query($sql) as $row):
    $myNumber = number_format($row['my_number']);

    $table .= <<<EOT
          <tr>
          <td>{$row['my_number']}</td> // WORKS
          <td>$myNumber</td> // WORKS
          <td>{number_format($row['my_number'])}</td> // DOES NOT WORK!
          </tr>
EOT;
endforeach;

Answer

mario picture mario · Nov 26, 2011

You can execute functions in a HEREDOC string by using {$ variable expressions. You however need to define a variable for the function name beforehand:

$number_format = "number_format";

$table .= <<<EOT
      <tr>
      <td>{$row['my_number']}</td> // WORKS
      <td>$myNumber</td> // WORKS
      <td>{$number_format($row['my_number'])}</td> // DOES NOT WORK!
      </tr>

So this kind of defeats the HEREDOCs purpose of terseness.


For readability it might be even more helpful to define a generic/void function name like $expr = "htmlentities"; for this purpose. Then you can utilize almost any complex expression and all global functions in heredoc or doublequotes:

    "   <td>  {$expr(number_format($num + 7) . ':')}  </td>  "

And I think {$expr( is just more obvious to anyone who comes across such a construct. (Otherwise it's just an odd workaround.)