I have a case where I’m retrieving an array of associative arrays from a database as shown below:
Array
(
\[0\] => Array
(
\[id\] => 1
\[some\_id\] => 100001
\[some\_company\_name\] => Foo
\[name\] => Bar
\[created\] => 2008-12-25 21:13:58
\[last\_updated\] => 2008-12-30 23:32:43
)
)
…but I need to represent this structure in XML. I have a pre-defined standard in my XML request/response that the element names are to be camel cased.
Aliasing the field names at the query level is just…a hack. So, I needed a way to convert “foo_bar_baz” to “fooBarBaz” before adding the XML element.
To do this, you can use preg_replace_callback() as shown below, which uses a callback function on every match found.
class FooController
{
public function barAction()
{
$dao = new Some\_Dao();
$rows = $dao->getWhateverRows();
foreach ($rows as $row) {
foreach ($row as $key => $value) {
// $key is "foo\_bar\_baz"
$key = preg\_replace\_callback(
'/\_(\\w)/',
array($this, '\_convertToCamelCase'),
$key);
// $key is now "fooBarBaz"
}
}
}
private function \_convertToCamelCase(array $matches)
{
return ucfirst($matches\[1\]);
}
}
There is an e
modifier that can be used with preg_replace(), but that requires the replacement string to be a valid string of PHP code. This forces the interpreter to parse the replacement string into PHP on each iteration, which can be quite inefficient. Instead, the preg_replace_callback()
uses a callback function, which only needs to be parsed once.
I suppose you could easily do the reverse, though I haven’t had a need to write that code yet. :) But…there you go! A little end-of-year tip from myself and the preg_replace() examples.