In the little experience I’ve had with programming in Python, I’ve found the defaultdict class to be one of the most useful.
PHP already has a limited version of this feature built in, called autovivification:
$arr = array();
$arr['foo']['bar'] = 1;
print_r( $arr['foo'] ); // Result: Array ( [bar] => 1 )
print_r( $arr['baz'] ); // Result: Undefined index: baz
As you can see, it doesn’t work when accessing an undefined value; when implicitly setting a value, you can only construct arrays.
Fortunately, it’s pretty easy to implement our own version of Python’s defaultdict
by using the special ArrayAccess
interface (requires PHP >= 5.3.4):
You use it just as if it were a regular associative array:
$counts = new Defaultdict(1);
echo $counts['foo']; // Result: 1
$counts['bar']++;
echo $counts['bar']; // Result: 2
And you can even pass an anonymous function for constructing new default values:
$instances = new Defaultdict( function( $key ) {
$value = new stdClass;
$value->id = $key;
return $value;
} );
print_r( $instances['bar'] ); // Result: stdClass Object ( [id] => bar )