4

有一根绳子,

$string = 'Foo, Bar, Test,';

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

但是一切都会导致无限的while循环。

所以,我试过#1:

$计数 = 0;

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

还有#2,

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

他们都永远不会结束。问题出在哪里?

4

4 回答 4

5

你可以使用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);
}
于 2013-02-18T06:58:22.340 回答
3

strpos()返回 的第一次出现$needle,因此除非您指定不同的$offset,否则您将始终得到相同的结果,因此是无限循环。

如果你坚持使用strpos(),试试这个:

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

当然,您可以使用它substr_count()来使事情变得更容易。

编辑

现场演示

于 2013-02-18T06:59:55.103 回答
2

试试这个 :

$text = 'Foo, Bar, Test,';
echo substr_count($text, ',');

参考: http: //php.net/manual/en/function.substr-count.php

于 2013-02-18T06:58:27.857 回答
0

或者如果 substr_count 不合适,试试这个:

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

我没有测试你是否绝对需要!==FALSE。如果您使用 mb_strpos ,则不会。

于 2013-11-14T13:02:38.393 回答