andreas
andreas

Reputation: 8004

Replace substring in keys of an array in PHP

Assume that you have a PHP array like this, coming from a mysqli query:

$array = (
    'user_id' => 1
    'user_name' => 'User',
    'user_email' => '[email protected]'
);

Now I would like to create an instance of my user class. The constructor takes an array but the keys should be 'id', 'name', and 'email'.

What is the fastest way to edit the array above so that I get a new array like this:

$newArray = (
    'id' => 1
    'name' => 'User',
    'email' => '[email protected]'
);

$user = new User($newArray);

Of course I could simply loop through the original $array and use preg_replace() like this:

$newArray = array();

foreach ($array as $key => $value) {
    $newKey = preg_replace('/^user_/', '', $key);
    $newArray[$newKey] = $value;
}

But there surely is a faster way who could solve this problem? At the moment I cannot think of a good way, that's how I ended up here.

Upvotes: 4

Views: 3669

Answers (2)

Niels Keurentjes
Niels Keurentjes

Reputation: 41958

If you're worried about performance, don't go doing trivial operations with regular expressions, they're inherently slow. Apart from that, since you're actively modifying keys, there's no other way than reconstructing a new array:

$params = [];
foreach($array as $key => $value)
  $params[substr($key, 5)] = $value;

In this code substr($key, 5) just strips the leading user_ part of each key and rebuilds the $params array to what you need. I'd be highly surprised if there was a faster solution.

If you actually want to check for data integrity and only extract the properly prefixed keys the problem becomes more complex:

function extractPrefixedElements(array $array, $prefix)
{
  $result = [];
  foreach($array as $key => $value)
  {
    list($pre, $newKey) = explode('_', $key, 2);
    if($pre == $prefix)
      $result[$newKey] = $value;
  }
  return $result;
}
extractPrefixedElements($array, 'user');

Upvotes: 3

Yang
Yang

Reputation: 8701

Surely you don't need preg_replace() here, because you're in the loop and regular expressions aren't always fast (because you initialize the whole engine on each iteration)

There's only one way you can do that - you should just replace user_ anywhere you encounter when iterating on array keys.

function prepare(array $array) {

   $result = array();

   foreach ($array as $key => $value) {
       $key = str_replace('user_', '', $key);

       $result[$key] = $value;
   }

   return $result;
}

// And finally
$newArray = prepare($array);

Upvotes: 3

Related Questions