php – strpos()在while循环中永远不会结束

有一个字符串,

$string = ‘Foo, Bar, Test,’;

我想要做的就是计算字符串中逗号的数量.

但是一切都会导致无限循环.

所以,我试过#1:

$count = 0;

while($pos = strpos($string, ',') !== FALSE){
    $count++;
    // Never ends
}

还有#2,

while(true){
  if ( strpos($string, ',') !== FALSE ){
     $count++;
  } else {
    break;
  }
}

他们都没有结束.哪里有问题?

解决方法:

你可以使用substr_count():

substr_count($string, ',');

在您的代码中,strpos()需要第三个参数来开始从特定偏移量进行搜索,例如:

strpos($string, ',', 12); // start searching from index 12

它不像迭代器那样工作.像这样的东西会起作用:

$start = 0;
while (($pos = strpos($string, ',', $start)) !== FALSE) {
  $count++;
  $start = $pos + 1;
}

更新

如果你想得到真正的幻想:

class IndexOfIterator implements Iterator
{
  private $haystack;
  private $needle;

  private $start;
  private $pos;
  private $len;
  private $key;

  public function __construct($haystack, $needle, $start = 0)
  {
    $this->haystack = $haystack;
    $this->needle = $needle;
    $this->start = $start;
  }

  public function rewind()
  {
    $this->search($this->start);
    $this->key = 0;
  }

  public function valid()
  {
    return $this->pos !== false;
  }

  public function next()
  {
    $this->search($this->pos + 1);
    ++$this->key;
  }

  public function current()
  {
    return $this->pos;
  }

  public function key()
  {
    return $this->key;
  }

  private function search($pos)
  {
    $this->pos = strpos($this->haystack, $this->needle, $pos);
  }
}

foreach (new IndexOfIterator($string, ',') as $match) {
  var_dump($match);
}
上一篇:玩转Node.js-Sequelize基础


下一篇:Lucene Wikipedia