Заменить подстроку в ключах массива в 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;
}
Но наверняка есть более быстрый способ, который могли бы решить эту проблему? В данный момент я не могу придумать хорошего способа, вот как я оказался здесь.
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');
Конечно, вам не нужно 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);