3

mysqli クエリから取得した、次のような PHP 配列があるとします。

$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;
}

しかし、誰がこの問題を解決できるより速い方法があるのでしょうか? 今のところ良い方法が思い浮かびません。

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()ループ内にあり、正規表現が常に高速であるとは限らないため、ここでは確かに必要ありません(反復ごとにエンジン全体を初期化するため)。

これを行う方法は 1 つしかありません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 に答える