Interpolation (double quoted string) of Associative Arrays in PHP

PhpAssociative Array

Php Problem Overview


When interpolating PHP's string-indexed array elements (5.3.3, Win32) the following behavior may be expected or not:

$ha = array('key1' => 'Hello to me');

print $ha['key1'];   # correct (usual way)
print $ha[key1];     # Warning, works (use of undefined constant)

print "He said {$ha['key1']}"; # correct (usual way)
print "He said {$ha[key1]}";   # Warning, works (use of undefined constant)

print "He said $ha['key1']";   # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print "He said $ha[ key1 ]";   # Error, unexpected T_ENCAPSED_AND_WHITESPACE
print "He said $ha[key1]";     # !! correct (How Comes?)

Inerestingly, the last line seems to be correct PHP code. Any explanations? Can this feature be trusted?


Edit: The point of the posting now set in bold face in order to reduce misunderstandings.

Php Solutions


Solution 1 - Php

Yes, you may trust it. All ways of interpolation a variable are covered in the documentation pretty well.

If you want to have a reason why this was done so, well, I can't help you there. But as always: PHP is old and has evolved a lot, thus introducing inconsistent syntax.

Solution 2 - Php

Yes, this is well defined behavior, and will always look for the string key 'key', and not the value of the (potentially undefined) constant key.

For example, consider the following code:

$arr = array('key' => 'val');
define('key', 'defined constant');
echo "\$arr[key] within string is: $arr[key]";

This will output the following:

$arr[key] within string is: val

That said, it's probably not best practice to write code like this, and instead either use:

$string = "foo {$arr['key']}"

or

$string = 'foo ' . $arr['key']

syntax.

Solution 3 - Php

The last one is a special case handled by the PHP tokenizer. It does not look up if any constant by that name was defined, it always assumes a string literal for compatibility with PHP3 and PHP4.

Solution 4 - Php

To answer your question, yes, yes it can, and much like implode and explode, php is very very forgiving... so inconsistency abound

And I have to say I like PHP's interpolation for basical daisy punching variables into strings then and there,

However if your doing only string variable interpolation using a single array's objects, it may be easier to write a template which you can daisy print a specific object variables into (like in say javascript or python) and hence explicit control over the variable scope and object being applied to the string

I though this guy's isprintf really useful for this kind of thing

http://www.frenck.nl/2013/06/string-interpolation-in-php.html

<?php

$values = array(
    'who'   => 'me honey and me',
    'where' => 'Underneath the mango tree',
    'what'  => 'moon',
);

echo isprintf('%(where)s, %(who)s can watch for the %(what)s', $values);

// Outputs: Underneath the mango tree, me honey and me can watch for the moon

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrubber bootsView Question on Stackoverflow
Solution 1 - PhpNikiCView Answer on Stackoverflow
Solution 2 - PhpmfondaView Answer on Stackoverflow
Solution 3 - PhpmarioView Answer on Stackoverflow
Solution 4 - PhpaqmView Answer on Stackoverflow