3

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

当然,我可以简单地遍历原始文件$arraypreg_replace()像这样使用:

$newArray = array();

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

但是肯定有更快的方法可以解决这个问题吗?目前我想不出什么好办法,就这样落到了这里。

4

2 回答 2

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');
于 2014-01-16T13:17:18.963 回答
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);
于 2014-01-16T13:24:21.573 回答