查找字符串中字母的所有出现点

时间:2013-02-16 20:11:13

标签: php arrays string search

我有以下代码:

<?php
    $word = "aeagle";
    $letter = "e";

    $array = strposall($aegle, $letter);

    print_r($array);

    function strposall($haystack, $needle) {
        $occurrence_points = array();

        $pos = strpos($haystack, $needle);
        if ($pos !== false) {
            array_push($occurrence_points, $pos);
        }

        while ($pos = strpos($haystack, $needle, $pos + 1)) {
            array_push($occurrence_points, $pos);
        }

        return $occurrence_points;
    }
?>

如示例所示,如果我的aegle为我的单词并且我在其中搜索e,则该函数应返回值为1和{{的数组1}}在其中。

我的代码出了什么问题?

4 个答案:

答案 0 :(得分:4)

为什么不尝试

$word = "aeagle";
$letter = "e";
$occurrence_points = array_keys(array_intersect(str_split($word), array($letter)));

var_dump($occurrence_points);

答案 1 :(得分:2)

我认为你传递了错误的参数,应该是$ word而不是$ aegle

答案 2 :(得分:2)

其他人已经指出你传递了错误的参数。但你也在重新发明轮子。看一下php's regular expression match-all(哎呀,已经链接了错误的函数),当与下面的标志一起使用时,它将返回一个带偏移的所有匹配的数组。

  

标志

     

标志 可以是以下标志:

     

<强> PREG_OFFSET_CAPTURE

     

如果传递此标志,则对于每个发生的匹配,还将返回附加字符串偏移量。请注意,这会将匹配的值更改为一个数组,其中每个元素都是一个数组,该数组由偏移量为0的匹配字符串和偏移量为1的主体的字符串偏移量组成。

对搜索词$letter = '/e/'使用单个字母模式,您应该返回一个数组,其中所有位置都是每个结果数组的第二个元素,然后您可以将其读入您正在查找的输出格式对

更新: Jared指出你确实得到了模式的捕获,但是设置了标志后,你也得到了偏移量。作为OP问题的直接答案,请尝试以下代码:

$word = "aeagle";
$pattern = "/e/";
$matches = array();

preg_match_all($pattern, $word, $matches, PREG_OFFSET_CAPTURE);

print_r($matches);

它有以下输出:

Array
(
  // Matches of the first pattern: /e/
  [0] => Array
  (
    // First match
    [0] => Array
    (
      // Substring of $word that matched
      [0] => e
      // Offset into $word where previous substring starts
      [1] => 1
    )

    [1] => Array
    (
      [0] => e
      [1] => 5
    )
  )
)

结果是3D而不是2D,因为preg_match_all可以同时匹配多个模式。命中是针对第一个(在这种情况下:仅)模式提供的,因此在第一个数组中。

与OP最初声明的不同,1和5是字符串e

中字母'aeagle'的正确索引
    aeagle
    012345
     ^   ^
     1   5

性能方面,strposall的自定义版本可能比正则表达式匹配更快。但是学习使用内置函数几乎总是比开发,测试,支持和维护自己的代码更快。 10次​​中有9次,这是编程中最昂贵的部分。

答案 3 :(得分:2)

比其他答案更加文字:

function charpos($str, $char) {
    $i = 0;
    $pos = 0;
    $matches = array();

    if (strpos($str, $char) === false) {
        return false;
    }

    while (!!$str) {
        $pos = strpos($str, $char);

        if ($pos === false) {
            $str = '';
        } else {
            $i = $i + $pos;
            $str = substr($str, $pos + 1);
            array_push($matches, $i++);
        }
    }

    return $matches;
}

https://ignite.io/code/511ff26eec221e0741000000

使用:

$str = 'abc is the place to be heard';
$positions = charpos($str, 'a');

print_r($positions);

while ($positions) {
    $i = array_shift($positions);
    echo "$i: $str[$i]\n";
}

给出了:

Array (
    [0] => 0
    [1] => 13
    [2] => 25
)
0: a
13: a
25: a