【问题标题】:More efficient way to merge arrays in PHP?在 PHP 中合并数组的更有效方法?
【发布时间】:2010-12-01 23:00:55
【问题描述】:

这就是我正在做的事情:

$dateRange = array('2010-01-01', '2010-01-02', '2010-01-03', ...);
$data = array('2010-01-01' => 5, '2010-01-03' => 7);

foreach ($dateRange as $date) {
    $values[$date] = $data[$date];
}

$values 结果:

array (
    '2010-01-01' => 5
    '2010-01-02' => null
    '2010-01-03' => 7
    ...
)

看起来相当高效,但我想知道是否有一个简单的 PHP 函数可以处理这个问题。

【问题讨论】:

  • php.net 是你的朋友... ;)
  • stackoverflow 也是如此 :) 我搜索了 php.net 但没有找到处理它的特定函数。

标签: php arrays merge


【解决方案1】:
$values = array_merge(array_fill_keys($dateRange, null), $data);

是否真的更高效只能通过测试才能发现,但我想说它更简洁,易于理解,并且它不会抛出错误 对于$data 中不存在的键。 :)

【讨论】:

  • 您应该切换参数的顺序,请参阅文档:“如果两个数组中都存在数组键,则将使用第一个数组中的元素和第二个数组中匹配键的元素将被忽略。”但是,array_merge 一旦“认为”它们是数字的,就会对你的键重新编号。所以我建议使用 + 运算符而不是 array_merge,因为它更容易预测。当键存在于第二个操作数时,这也会保留第一个操作数的值。使用:$data + array_fill_keys($dateRange, null) 或:array_merge($data, array_fill_keys($dateRange, null)
  • @ontrack 我不知道您正在阅读哪些文档,但array_merge 说:If the input arrays have the same string keys, then the later value for that key will overwrite the previous one. 我每天都在使用array_merge,这就是它的工作原理。此外,这些显然是字符串键,而不是数字键。
  • 我的引用来自示例#3,我似乎错过了文档的顶部。但那句话实际上是专门关于 + 运算符的。(我更喜欢)运算符的原因是因为一旦您开始使用数字键,行为就会发生变化。 Ergo:它目前按预期工作,但在看似相似的情况下停止工作。我试图避免特别是因为它提倡错误。也许您想开始使用与日期数字类似的东西。
  • @ontrack 关于array_merge 保持排序顺序不变,还有一些话要说。 :) 您有一点关于将键更改为日期数字,但此时它会提交您正在谈论一个完全不同的脚本,并且无论如何都需要重新评估您在数组上执行的每个操作。无需竭尽全力确保您的脚本在内部是面向未来的。 ;) 所以,只是为了记录:$values = $data + array_fill_keys($dateRange, null) 应该工作相同,除了结果的顺序。
【解决方案2】:

array_merge,但它会产生1 => 2010-01-02 而不是2010-01-02 => null

http://us.php.net/manual/en/ref.array.php也有一大堆数组函数

[编辑]:因为链接而留下这个答案,但另一个答案正是你想要的。

【讨论】:

    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2016-03-04
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多