在PHP中替换数组键中的子字符串

时间:2014-01-16 13:06:29

标签: php arrays replace array-key

假设你有一个像这样的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;
}

但肯定有更快的方法可以解决这个问题吗?目前我想不出一个好方法,这就是我在这里结束的方式。

2 个答案:

答案 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);