【问题标题】:PHP: Hashtable optimizationPHP:哈希表优化
【发布时间】:2017-12-22 23:53:28
【问题描述】:

我的程序中有两个静态哈希表:

public static $labels = [
    'id' => 'ID',
    'name' => 'Name',
    'email' => 'E-mail',
    'password' => 'Password',
];

public static $columnTypes = [
    'id' => 'number',
    'name' => 'text',
    'email' => 'text',
    'password' => 'text',
];

第一个用于数据库列的标签,第二个用于每种类型(过滤所必需的)。

我的问题是,我经常需要通过标签获取列的类型,这会导致速度问题(哈希表在这个方向上相当慢,对吧?)。

我的方法如下:

  1. 键入一个哈希表 label => type 这很糟糕,因为我必须重复自己并且不支持其他语言
  2. 在运行时在静态内容中创建 label => type 哈希表(这在 php 中可行吗?)

对于这个问题是否有更好的方法或最佳实践?在 php 中是否可以使用第二种方法? (也许有一个小例子;)

【问题讨论】:

  • 也许看看array_flip
  • 我知道如何进行翻转,但如何在静态内容中进行?
  • “哈希表在这个方向上很慢,对吧?” -- 错误。而且,无论如何,您在 PHP 中拥有的唯一数据结构名为“array”,但实际上它是一个哈希表(又名字典,又名关联映射)。
  • 谢谢。我想获得一个值的键,你必须遍历整个哈希表?

标签: php performance hashtable


【解决方案1】:

如果您需要获取具有该值的键,则可以使用array_search()array_keys()

如果您需要在 large 数组中进行这种查找 big 次,那么建议翻转键和值(使用 array_flip())然后使用isset()access the value using []

为了得到真正的改进,上一段中的largebig应该以千计。否则,请专注于真正需要优化的地方:数据库、磁盘访问、远程 API 等。

【讨论】:

    【解决方案2】:

    在类构造函数中调用array_flip。为避免重复,请检查翻转数组是否已设置。

    class YourClass {
        public static $labels = [
            'id' => 'ID',
            'name' => 'Name',
            'email' => 'E-mail',
            'password' => 'Password',
        ];
        public static $labels_flipped = null;
    
        public function __construct() {
            if (!$labels_flipped) {
                $labels_flipped = array_flip($labels);
            }
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      相关资源
      最近更新 更多