【问题标题】:Is it bad to have a long name for an associative array in PHP?在 PHP 中为关联数组取一个长名称是不是很糟糕?
【发布时间】:2010-06-30 18:09:42
【问题描述】:

我有一个必须返回一维关联数组的函数,例如$user_info[$index]=value,其中$index 是一个由

组成的字符串
  • user_id
  • 全名
  • 照片文件名

例如,我的关联数组可能类似于 $user_info['user-123456789~~Bill Gates~~bill_gates.png']=$value。我需要 user_id、full_name 和 photo 来满足其他需求,以便知道这是谁的值以及他的全名是什么等。
因此,提出的问题如下:

  1. 如果考虑到应用程序的性能,有这样的数组可以吗?
  2. 如果不好(我认为这是个坏主意),那么在这种情况下我该如何解决我的问题。

其他信息。此函数将用户信息检索到此关联数组中并返回此数组。此外,我的应用程序将它存储在会话中,以便直接从会话变量中解决它并检索信息,而不是再次执行查询。最后,我需要一维数组的原因是我使用了一个函数array_diff,其中一个数组是$user_info 数组。
请注意,考虑到一个用户可能有 1 个或多个值。

任何建议都会很高兴。

【问题讨论】:

  • 嘿,我的问题有什么问题吗?请至少留下一个评论人。这不只是。
  • 是的,不值得投反对票。
  • 只要您的阵列很小,您就不必担心。无论如何,出于多种原因,您必须避免使用大型数组。所以,这个问题本身并不是那么明智,尽管不是一个可否决的 imo。
  • 键是唯一标识哈希表中的一个项目。如果您的用户 ID 是唯一的,为什么还需要名称和图片作为标识符? (特别是因为名称和文件名肯定不是唯一的)

标签: php associative-array


【解决方案1】:

您在关联数组中有一个长

我认为这不是问题。如果你想缩短它,你可以散列你的键值并将值与散列值一起存储。

话虽如此,您是否问过自己为什么要使用该架构?想出一个不同的数据结构来满足您的需求会更好吗?

我会更关心您存储在会话变量中的数据量(数组的大小)。我认为像这样使用会话来存储数据是个坏主意。

【讨论】:

  • +1 用于指出会话瓶颈。请注意,PHP 中的会话通常作为序列化数组存储到磁盘上的文件中。大型阵列的序列化和反序列化会占用大量 CPU 时间,并且会话的额外磁盘工作也可能成为瓶颈。
  • +1。你可能是对的。我需要改变我拥有的数据存储结构。
  • 如果我不在会话中保存这些信息,您知道有什么问题吗?每次用户刷新页面时,我都需要对数据库执行查询。此外,我需要对检索到的数据进行计算。但是在会话中,我只做一次,如果设置了会话,我只打印它。关于如何解决这个问题的任何想法?
  • @Bakhtiyor 您是在多页还是只在一个页面上使用会话数据?每次页面加载时,我都会从数据库中获取数据。您所描述的是缓存和(imo)会话不是这样做的地方。
  • 问题实际上不在于从数据库中获取数据。但是我需要对这些数据进行一些复杂的数学运算,它们会显示其中的一部分(结果)。我只在一页中使用它。
【解决方案2】:

当您考虑维护/可读性成本时,将这么多信息连接到一个字符串中所获得的任何性能都很容易丢失。当下一个程序员出现并开始阅读您的代码时,这是否容易理解?

我建议另一种数据结构:

$user_info[$user_id] = array(
  'user_id'         => $user_id, // Redundant but helpful
  'full_name'       => $full_name,
  'photo_file_name' => $photo,
  'value'           => $value
);

【讨论】:

  • 但要考虑到一个用户可能有 1 个或多个值。
  • 既然 OP 提到他想要 array_diff 数组,你可以 md5 OP 用于复合键的键。然后 OP 可以array_diff_key 数组。
【解决方案3】:

所以您将信息(不仅仅是一个键)存储到 ~ 分隔的数组键中?看起来真的很丑。不过,这可能不是性能问题*。

是否无法重新实现 array_diff 而是根据您的需要进行修改?

**) 我在手册中查看了有关如何处理密钥的信息(可能是平衡 b 树?),但找不到任何令人满意的东西。实际上可能存在性能问题,具体取决于实现,但 PHP 通常擅长此类工作。*

【讨论】:

  • 嗯,这只是对问题的快速认识,我没想到那有多难看。但知道我很担心。
【解决方案4】:

关于术语:在您的示例中,关联数组的名称是$user_info'user-123456789~~Bill Gates~~bill_gates.png' 是数组的一个。 PHP 中的数组有 keysvalues

回答您的问题:不,拥有其键是长字符串的关联数组并没有什么特别的错误; PHP 并不特别在意。 (无论如何,您给出的示例并不是真正的“长”字符串。)

但是,如上所述,您做事的方式听起来确实可以改进。考虑采用 Mike B 建议的数组结构,或者实现一个“用户”类并从您的函数中返回一个用户数组。

【讨论】:

  • 是的,但我没有在问题中提到它,但一个用户可以有 1 个或多个值。我更新了问题。很抱歉。
猜你喜欢
  • 2015-01-14
  • 2013-04-17
  • 2013-08-05
  • 1970-01-01
  • 2011-09-20
  • 2018-01-20
  • 1970-01-01
  • 2011-10-06
  • 2012-02-17
相关资源
最近更新 更多