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

間違ったパラメータを渡していると思います。$aegleではなく$wordにする必要があります

于 2013-02-16T20:16:56.763 に答える
2

他の人はあなたが間違ったパラメータを渡していると指摘しました。しかし、あなたはまた、車輪の再発明をしています。phpの正規表現match-all (おっと、間違った関数をリンクしていた)を見てください。次のフラグと一緒に使用すると、オフセット付きのすべての一致の配列がすでに返されます。

フラグ

フラグは次のフラグにすることができます。

PREG_OFFSET_CAPTURE

このフラグが渡されると、一致が発生するたびに、追加の文字列オフセットも返されます。これにより、一致の値が配列に変更されることに注意してください。すべての要素は、オフセット0の一致した文字列と、オフセット1のサブジェクトへのその文字列オフセットで構成される配列です。

検索語に1文字のパターンを使用する$letter = '/e/'と、各結果配列の2番目の要素としてすべての位置を含む配列が返されます。これにより、探している出力形式に仕上げることができます。

更新: 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
    )
  )
)

preg_match_allは一度に複数のパターンに一致する可能性があるため、結果は2Dではなく3Dになります。ヒットは、指定された最初の(この場合はのみ)パターンに対するものであるため、最初の配列に含まれます。

また、最初に述べたOPとは異なり、1と5はe文字列内の文字の正しいインデックスです。'aeagle'

    aeagle
    012345
     ^   ^
     1   5

パフォーマンスの面では、strposallのカスタマイズされたバージョンは、正規表現の一致よりもおそらく高速です。ただし、組み込み関数の使用法を学ぶことは、ほとんどの場合、独自のコードを開発、テスト、サポート、および保守するよりも高速です。そして、10回のうち9回は、プログラミングの最も高価な部分です。

于 2013-02-16T20:28:41.537 に答える
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 に答える