【问题标题】:How to rewrite this php filterArray function for better performance如何重写这个 php filterArray 函数以获得更好的性能
【发布时间】:2013-09-05 14:04:35
【问题描述】:

我在一个类中有一个 filterArray 方法,用于过滤出基于另一个数组的数组:

function filterArray($needle, $heystack, $always = array())
{
    foreach($heystack as $k => $v)
    {
        if( !in_array($v, $needle) && !in_array($v, $always) )
            unset($heystack[$k]);
    }

    return $heystack;
}

用法:

$chars  = array('l', 'J', 'F');
$keys   = array('d','D','j','l','N','S','w','z','W','F','m','M','n','t','L','o','Y','y','a','A','c','r','e','T');
$keys   = filterArray($chars, $keys, array('z'));

请注意,$always 是一个应始终存在且不应被过滤掉的项目数组。 key的结果是:

$keys   = array('l', 'J', 'F', 'z');

这更像是一个验证过程。有没有更好的方法来编写它并优化它的性能?因为它用于性能至关重要的类中。

谢谢。

【问题讨论】:

  • in_array 很慢,使用链表
  • @DevZer0 那是 PHP >= 5.3 我的代码需要 5.2+

标签: php arrays function filtering


【解决方案1】:

您没有指定是否需要维护键关联,如果不需要键关联,您可以执行以下功能。

function filterArray($needle, $heystack, $always = array())
{
    return array_intersect(array_merge($needle, $always), $heystack);
}

【讨论】:

  • 谢谢,就是这个。它要快得多。在我的机器上执行 0.000007 秒,而旧版本在 0.0001 秒内执行
【解决方案2】:

这应该可以解决问题。

function filterArray($needle, $heystack, $always = array()) {

    $merged = array_merge($needle, $always);

    return array_intersect($heystack, $merged);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2014-08-23
    • 2015-09-20
    相关资源
    最近更新 更多