【问题标题】:Does array_values in PHP loop through all the items?PHP中的array_values是否循环遍历所有项目?
【发布时间】:2018-10-23 16:26:39
【问题描述】:

我想知道内置的 PHP 数组函数,例如 array_diffarray_keysarray_values(与 array_walk 相比)是否遍历每个项目,或者它们是否有一个内部算法来进行计算一口气?

当我想学习如何优化处理 100,000 个项目的 PHP 脚本时,这一点很重要。

例如这个方法:

public function narrowDown($BigArray, $Column, $regex)
{
    # narrowDown to focus on columns with similar data
    $Column = array_column($BigArray, $Column);
    $Search = preg_quote($regex, '~');
    $Matched = preg_grep('~'.$Search.'~', array_combine(array_keys($BigArray), $Column));
    # recreate rows by intersecting with specified keys
    return array_intersect_key($BigArray, $Matched);
}

此方法通过正则表达式在多维数组中找出指定列中的相似行。 该数组有 18 列和 100,000 个项目。我在想什么应该是优化这些方法的最佳方式。

如果我应该改用其他编程语言,请随时提出建议。

【问题讨论】:

  • 他们遍历数组中的每一项
  • 那么这段代码很慢,我宁愿做一个foreach循环对吗? @IlyaBursov
  • 是的,foreach 将通过数组进行单次扫描,当前函数至少执行 4 次
  • 只需尝试两种方式并对其进行基准测试。一些array_*-函数比手动foreach 慢,有些更快。自己测试总是最安全的。在这种情况下你真的需要正则表达式吗?这肯定会减慢速度

标签: php arrays optimization


【解决方案1】:

是的,它们遍历所有项目,也调用它们,它们的结果不会以任何方式缓存。

所以如果你用完全相同的输入调用数组函数两次,所有的工作都将完成两次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多