0

我有以下代码:

<?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其中的数组。14

我的代码有什么问题?

4

4 回答 4

4

为什么不尝试

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

var_dump($occurrence_points);
于 2013-02-16T20:17:41.653 回答
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
于 2013-02-16T20:59:19.630 回答
2

其他人指出您传递了错误的参数。但你也在重新发明轮子。看一下php 的正则表达式 match-all(哎呀,链接了错误的函数),当与以下标志一起使用时,它已经返回了一个包含所有带有偏移量的匹配项的数组。

旗帜

flags可以是以下标志:

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 可以一次匹配多个模式。命中是针对第一个(在这种情况下:仅)提供的模式,因此在第一个数组中。

e并且与 OP 最初所说的不同,1 和 5 是字符串中字母的正确索引'aeagle'

    aeagle
    012345
     ^   ^
     1   5

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

于 2013-02-16T20:28:41.537 回答
2

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

于 2013-02-16T20:16:56.763 回答