我有以下代码:
<?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}}在其中。
我的代码出了什么问题?
答案 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