【问题标题】:PHP: Search if array contains values starting by a valuePHP:搜索数组是否包含以值开头的值
【发布时间】:2011-12-21 22:57:38
【问题描述】:

我已经创建了一个函数来搜索数组并查找以 2d 参数开头的值:

  public static function arrayContainsValueStartingBy($haystack, $needle) {
      $len = strlen($needle);
      foreach ($haystack as $hay) {
          if (substr($hay, 0, $len) == $needle) {
              return true;
          }
      }
      return false;
  }

我觉得它没有优化到最好,你能给我一些改进的方向吗?

【问题讨论】:

标签: php arrays function optimization


【解决方案1】:

您必须分析代码以查看它是否有任何不同(实际上可能更糟,具体取决于您拥有的字符串的大小),但您可以使用strpos [docs] 而不是substr

public static function arrayContainsValueStartingBy($haystack, $needle) {
   foreach ($haystack as $hay) {
      if (strpos($hay, $needle) === 0) {
          return true;
      }
   }
   return false;
}

除此之外,我认为没有太大的改进空间。在任何情况下,您都必须迭代元素,尽早停止并且您已经在这样做了。

【讨论】:

  • strpos 会检查大海捞针中的每个位置,而使用substr 它只检查一个位置。所以substr 会更快。就我个人而言,我想不出如何使它比问题中的代码更好。
  • @Kolink:这就是我说的原因,它可能会更糟,具体取决于字符串的大小。我不知道strpossubstr 的实现,所以运行strpos 可能仍然比创建新字符串要快。在这种情况下,哪个代码性能更好实际上取决于数据。
  • 我的 $haystack 包含 20 行,最多 5 个字符。
  • @mnml:针的尺寸是多少?但是对于这么小的数据集,我认为您不会看到任何性能差异。
  • @felix 针永远是 2char 长
【解决方案2】:

不确定使用 array_filter 循环是否会更快:

$testArray = array('Hello',
                   'World',
                   'Aardvark',
                   'Armadillo',
                   'Honey Badger'
                  );

$needle = 'A';


class beginsWith {
    private $_needle = NULL;

    function __construct($needle) {
        $this->_needle = $needle;
    }

    public function filter($string) {
        return (strpos($string, $this->_needle) === 0);
    }
}


$matches = array_filter($testArray, array(new beginsWith($needle), 'filter'));


var_dump($matches);

虽然实例化 beginWith 类可能会增加开销。

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2022-08-19
    • 2019-10-11
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多