Заменить подстроку в ключах массива в PHP


Предположим, что у вас есть такой PHP-массив, полученный из запроса mysqli:

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

Теперь я хотел бы создать экземпляр моего пользовательского класса. Конструктор принимает массив, но ключами должны быть "идентификатор", "имя" и "электронная почта".

Каков самый быстрый способ отредактировать массив выше, чтобы я получил новый массив, подобный этому:

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

$user = new User($newArray);

Конечно, я мог бы просто просмотреть оригинал $array и использовать preg_replace() вот так:

$newArray = array();

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

Но наверняка есть более быстрый способ, который могли бы решить эту проблему? В данный момент я не могу придумать хорошего способа, вот как я оказался здесь.

Author: andreas, 2014-01-16

2 answers

Если вы беспокоитесь о производительности, не выполняйте тривиальные операции с регулярными выражениями, они по своей сути медленные. Кроме того, поскольку вы активно изменяете ключи, нет другого способа, кроме восстановления нового массива:

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

В этом коде substr($key, 5) просто удаляет начальную часть user_ каждого ключа и перестраивает массив $params так, как вам нужно. Я был бы очень удивлен, если бы нашлось более быстрое решение.

Если вы действительно хотите проверить целостность данных и только извлечение ключей с правильными префиксами проблема усложняется:

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');
 3
Author: Niels Keurentjes, 2014-01-16 14:04:20

Конечно, вам не нужно preg_replace() здесь, потому что вы находитесь в цикле, а регулярные выражения не всегда быстры (потому что вы инициализируете весь движок на каждой итерации)

Есть только один способ сделать это - вы должны просто заменить user_ везде, где вы сталкиваетесь при повторении ключей массива.

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);
 2
Author: Yang, 2014-01-16 13:24:21