【问题标题】:Replace substring in keys of an array in PHP替换PHP中数组键中的子字符串
【发布时间】:2014-02-05 09:54:00
【问题描述】:

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

但肯定有更快的方法可以解决这个问题?暂时想不出好办法,就这样落到了这里。

【问题讨论】:

  • “更快”是什么意思?你所拥有的是合理的,虽然正则表达式可能是矫枉过正。
  • 每个人都说 for/foreach 在 PHP 中非常慢,有时 PHP 中的某些方法比自定义循环更快(例如,array_walk 等)。性能对我来说可能是个问题,因为我在运行时创建了许多用户实例。
  • 与内置插件相比它们速度较慢,但​​有一个问题。 PHP 中的函数调用也很慢,array_walk & co 将为每个项目调用一次回调。这很可能最终会比foreach 更糟。无论如何,在我看来,您问题的答案只是“衡量它”。

标签: php arrays replace array-key


【解决方案1】:

如果您担心性能,请不要使用正则表达式进行琐碎的操作,它们本来就很慢。除此之外,由于您正在积极修改键,因此除了重建新数组之外别无他法:

$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');

【讨论】:

  • 好的,如果我需要检查字符串是否以“user_”开头,您是否建议使用 if 子句检查 substr($key, 5) 与“user_”?
  • 实际上,我建议修改:声明一些变量(其中包含要替换的字符串),如$replace = 'user_',然后计算它的长度,如$l = strlen($replace); - 然后传递substr($key, $l)进入你的循环。这将是更常见的解决方案,只是开销更大
  • @andreas 这是另一个问题,这是“什么是从数组中的每个键中去除相同前导字符串的最快方法”的解决方案。如果您必须检查数据完整性,其他因素就会发挥作用。
  • @andreas 添加了匹配所需前缀的解决方案。 explode 实际上在引擎盖下相当高效,所以这应该相当快。
【解决方案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);

【讨论】:

  • 为什么这个答案在我的 6 分钟后发布并且基本相同,但 较慢 因为在这种情况下 str_replace 从根本上比 substr 慢,获得更多支持?
  • @NielsKeurentjes 我不知道。甚至不正确的原因会像some_user_field这样的键失败
  • @AlmaDo 谁说可以是some_user_field?还是别的什么?那将是另一种解决方案
  • @djay 谁说不可能?这就是为什么通常最好尝试预测所有情况(尤其是所有极端情况)
  • @djay 或 user_created_by_user_id 也会严重崩溃,而且很有可能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
  • 2013-12-06
  • 1970-01-01
  • 2019-03-21
  • 2011-06-26
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多