假设你有一个像这样的PHP数组,来自mysqli查询:
$array = (
'user_id' => 1
'user_name' => 'User',
'user_email' => 'mail@user.com'
);
现在我想创建一个用户类的实例。构造函数采用数组,但键应为'id','name'和'email'。
编辑上面数组的最快方法是什么,以便我得到一个像这样的新数组:
$newArray = (
'id' => 1
'name' => 'User',
'email' => 'mail@user.com'
);
$user = new User($newArray);
当然,我可以简单地遍历原始$array
并像这样使用preg_replace()
:
$newArray = array();
foreach ($array as $key => $value) {
$newKey = preg_replace('/^user_/', '', $key);
$newArray[$newKey] = $value;
}
但肯定有更快的方法可以解决这个问题吗?目前我想不出一个好方法,这就是我在这里结束的方式。
答案 0 :(得分:3)
如果你担心性能,不要用正则表达式做琐碎的操作,它们本身就很慢。除此之外,由于你正在积极修改密钥,除了重建一个新数组之外别无他法:
$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');
答案 1 :(得分:2)
当然你在这里不需要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);